使用vi编写HelloWorld.cpp程序,运行后,在控制台输出“Hello World!”
实现此案例需要按照如下步骤进行。
步骤一:打开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编译器对源代码进行编译链接,生成可执行文件。运行查看结果。
本案例的完整代码如下所示:
#include <iostream> int main(intargc, constchar * argv[]) { std::cout<<"Hello World!"<<std::endl; return0; }
无名名字空间,又称为全局名字空间,不属于任何有名名字空间的标识符,都隶属于无名命名空间。全局作用域中定义的标识符被隐式地添加到无名名字空间中。
实现此案例需要按照如下步骤进行。
步骤一:在无名名字空间中定义成员
代码如下所示:
#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;
本案例中的完整代码如下所示:
#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; }
多层名字空间,又称为名字空间的嵌套,是指定义在其他名字空中的名字空间。
实现此案例需要按照如下步骤进行。
步骤一:定义多层名字空间
代码如下所示:
#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();
对于内层名字空间中的成员的引用,需要通过作用域限定操作符逐层的分解。
本案例中的完整代码如下所示:
#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; }
结构体是一种由用户定义的数据类型。在C和C++中都有结构体,但C++中的结构体对C语言中的结构体概念进行了扩充,主要表现在两个方面:首先在定义结构体变量时,C++的结构体可以省略struct关键字;第二点,C++中的结构体可以有函数成员。
实现此案例需要按照如下步骤进行。
步骤一:定义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();
是对结构体中函数的调用,其方法与引用数据成员相同。
本案例中的完整代码如下所示:
#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; }
联合可以没有名字,被称为匿名联合。匿名联合仅仅通知编译器它的成员变量共同享一个地址,而变量本身是直接引用的,不使用通常的点号运算符语法。
实现此案例需要按照如下步骤进行。
步骤一:定义匿名联合
代码如下所示:
#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。
本案例中的完整代码如下所示:
#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; }
枚举是一种由用户定义的数据类型。在C和C++中都有枚举,但C++中的枚举对C语言中的枚举概念进行了扩充,主要表现在两个方面:首先在定义枚举变量时,C++的枚举可以省略enum关键字;第二点,C++中的枚举是一种独立的数据类型。
实现此案例需要按照如下步骤进行。
步骤一:定义匿名联合
代码如下所示:
#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++中不能将枚举常量直接赋值给一个整型变量。
本案例中的完整代码如下所示:
#include <iostream> enum Color { RED, YELLOW, BLUE, WHITE, BLACK }; int main(intargc, constchar * argv[]) { Colorcolor = RED; int n; n = YELLOW; return0; }