Top

CSDSTDCPP01 DAY01

  1. Hello, World !
  2. 无名名字空间
  3. 多层名字空间
  4. C++的结构
  5. C++的匿名联合
  6. C++的枚举

1 Hello, World !

1.1 问题

使用vi编写HelloWorld.cpp程序,运行后,在控制台输出“Hello World!”

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:打开vi,编辑源程序

代码如下:

#include <iostream>

int main(intargc, constchar * argv[])
{

std::cout<<"Hello World!"<<std::endl;

return0;
}

上述代码中,以下代码:

std::cout<<"Hello World!"<<std::endl;

是在控制台上输出字符串“Hello World!”,其中std::cout是一个对象,在本语句中相当于C语言中的printf函数。<<为输出流控制符。std::endl表示输出一个换行符,相当于C语言中的\n。

步骤二:使用gcc进行编译连接

在控制台使用gcc编译器对源代码进行编译链接,生成可执行文件。运行查看结果。

1.3 完整代码

本案例的完整代码如下所示:

#include <iostream>

int main(intargc, constchar * argv[])
{

std::cout<<"Hello World!"<<std::endl;

return0;
}

2 无名名字空间

2.1 问题

无名名字空间,又称为全局名字空间,不属于任何有名名字空间的标识符,都隶属于无名命名空间。全局作用域中定义的标识符被隐式地添加到无名名字空间中。

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:在无名名字空间中定义成员

代码如下所示:

#include <iostream>

intvar = 100;

int main(intargc, constchar * argv[])
{

std::cout<<"var = "<<var<<std::endl;
return0;
}

上述代码中,全局变量var就定义在无名名字空间中。

步骤二:使用无名名字空间中成员的冲突

代码如下所示:

#include <iostream>

namespace ns {
intvar = 10;
void fun (void){
int a = 10;
std::cout<<"a = "<< a <<std::endl;
    }
}

intvar = 100;

int main(intargc, constchar * argv[])
{

intvar = 200;
std::cout<<"var = "<<var<<std::endl;
std::cout<<"::var = "<< ::var<<std::endl;
std::cout<<"ns::var = "<<ns::var<<std::endl;

return0;
}

上述代码中,以下代码:

std::cout<<"var = "<<var<<std::endl;

变量var为局部变量,因为局部变量会隐藏全局变量,此时如果想要使用全局变量,需要在变量var前加作用域限定符::。

代码如下所示:

std::cout<<"::var = "<< ::var<<std::endl;

2.3 完整代码

本案例中的完整代码如下所示:

#include <iostream>

namespace ns {
intvar = 10;
void fun (void){
int a = 10;
std::cout<<"a = "<< a <<std::endl;
    }
}

intvar = 100;

int main(intargc, constchar * argv[])
{

intvar = 200;
std::cout<<"var = "<<var<<std::endl;
std::cout<<"::var = "<< ::var<<std::endl;
std::cout<<"ns::var = "<<ns::var<<std::endl;

return0;
}

3 多层名字空间

3.1 问题

多层名字空间,又称为名字空间的嵌套,是指定义在其他名字空中的名字空间。

3.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义多层名字空间

代码如下所示:

#include <iostream>

namespace ns1 {
intvar = 10;
namespace ns2 {
intvar = 20;
void fun (void){
std::cout<<"ns2::var = "<<var<<std::endl;
        }
    }
}

int main(intargc, constchar * argv[])
{

std::cout<<"ns1::var = "<<ns1::var<<std::endl;
ns1::ns2::fun();

return0;
}

上述代码中,以下代码:

void fun (void){
std::cout<<"ns2::var = "<<var<<std::endl;
        }

中的变量var是名字空间ns2中的整型变量成员var,因为内层空间中的同名成员会隐藏外层空间中的同名成员。

上述代码中,以下代码:

ns1::ns2::fun();

对于内层名字空间中的成员的引用,需要通过作用域限定操作符逐层的分解。

3.3 完整代码

本案例中的完整代码如下所示:

#include <iostream>

namespace ns1 {
intvar = 10;
namespace ns2 {
intvar = 20;
void fun (void){
std::cout<<"ns2::var = "<<var<<std::endl;
        }
    }
}

int main(intargc, constchar * argv[])
{

std::cout<<"ns1::var = "<<ns1::var<<std::endl;
ns1::ns2::fun();

return0;
}

4 C++的结构

4.1 问题

结构体是一种由用户定义的数据类型。在C和C++中都有结构体,但C++中的结构体对C语言中的结构体概念进行了扩充,主要表现在两个方面:首先在定义结构体变量时,C++的结构体可以省略struct关键字;第二点,C++中的结构体可以有函数成员。

4.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义C++结构

代码如下所示:

#include <iostream>

struct User {
char name[256];
int age;
void who (void) {
std::cout<<"我是"<< name <<",今年"<< age <<"岁。"<<std::endl;
    }
};

int main(intargc, constchar * argv[])
{

Useruser = {"张飞", 25};

user.who();

return0;
}

上述代码中,以下代码:

void who (void) {
std::cout<<"我是"<< name <<",今年"<< age <<"岁。"<<std::endl;
    }

是定义在结构体User中的函数,在C++中这样定义是合法的。

上述代码中,以下代码:

Useruser = {"张飞", 25};

是定义结构体变量,并进行初始化。在定义变量时,C++允许省略关键字struct,直接使用结构体名做数据类型。

上述代码中,以下代码:

user.who();

是对结构体中函数的调用,其方法与引用数据成员相同。

4.3 完整代码

本案例中的完整代码如下所示:

#include <iostream>

struct User {
char name[256];
int age;
void who (void) {
std::cout<<"我是"<< name <<",今年"<< age <<"岁。"<<std::endl;
    }
};

int main(intargc, constchar * argv[])
{

Useruser = {"张飞", 25};

user.who();

return0;
}

5 C++的匿名联合

5.1 问题

联合可以没有名字,被称为匿名联合。匿名联合仅仅通知编译器它的成员变量共同享一个地址,而变量本身是直接引用的,不使用通常的点号运算符语法。

5.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义匿名联合

代码如下所示:

#include <iostream>

int main(intargc, constchar * argv[])
{

union {
int n;
char c[sizeof (n)];
    };

    n = 0x12345678;

for (size_ti = 0; i<sizeof (c); ++i)
printf ("%#x ", c[i]); // 0x78 0x56 0x34 0x12
printf ("\n");

return0;
}

上述代码中,以下代码:

union {
int n;
char c[sizeof (n)];
    };

定义了一个匿名联合,因为整型变量n占4个字节,而字符数组c的元素个数为sizeof (n),即也是4个字节,所以整型变量n与字符数组c共用4个字节的地址空间。

上述代码中,以下代码:

    n = 0x12345678;

将整型变量n赋值为0x12345678,而这个16进制数刚好占4个字节,由于整型变量n在内存中是倒着存放的,所以n所占的4个字节中第一个存放了十六进制数0x78,第二个存放的是0x56,第三个存放的是0x34,第四个存放的是0x12。又由于字符数组c与整型变量n共用4个字节,所以,以下代码:

for (size_ti = 0; i<sizeof (c); ++i)
printf ("%#x ", c[i]); // 0x78 0x56 0x34 0x12
printf ("\n");

将字符数组c逐个输出时,得到的结果是0x78 0x56 0x34 0x12。

5.3 完整代码

本案例中的完整代码如下所示:

#include <iostream>

int main(intargc, constchar * argv[])
{

union {
int n;
char c[sizeof (n)];
    };

    n = 0x12345678;

for (size_ti = 0; i<sizeof (c); ++i)
printf ("%#x ", c[i]); // 0x78 0x56 0x34 0x12
printf ("\n");

return0;
}

6 C++的枚举

6.1 问题

枚举是一种由用户定义的数据类型。在C和C++中都有枚举,但C++中的枚举对C语言中的枚举概念进行了扩充,主要表现在两个方面:首先在定义枚举变量时,C++的枚举可以省略enum关键字;第二点,C++中的枚举是一种独立的数据类型。

6.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:定义匿名联合

代码如下所示:

#include <iostream>

enum Color {
    RED, YELLOW, BLUE, WHITE, BLACK
};

int main(intargc, constchar * argv[])
{

Colorcolor = RED;

int n;
    n = YELLOW;

return0;
}

上述代码中,以下代码:

Colorcolor = RED;

定义了一个枚举类型Color的变量color,并初始化为RED。在C++中,定义是可以省略关键字enum。

上述代码中,以下代码:

int n;
    n = YELLOW;

是错误的。在C++中不能将枚举常量直接赋值给一个整型变量。

6.3 完整代码

本案例中的完整代码如下所示:

#include <iostream>

enum Color {
    RED, YELLOW, BLUE, WHITE, BLACK
};

int main(intargc, constchar * argv[])
{

Colorcolor = RED;

int n;
    n = YELLOW;

return0;
}