【C++】C++入门的杂碎知识点
思维导图大纲:
namespac命名空间
- 什么是namespace命名空间
- namespace命名空间有什么用
什么是命名空间
namespace命名空间是一种域,它可以将内部的成员隔绝起来。举个例子,我们都知道有全局变量和局部变量,全局变量存在于全局域中,局部变量存在于局部域中,看下段代码 ,根据已经学习的知识我们都知道局部优先,所以输出会打印局部变量的数据。
#include // 全局域 int a = 10; int main() { // 局部域 int a = 0; printf("%d", a); }
由上述代码可以知道,不同的域可以存在相同名称的变量,而输出函数会优先在最近的域中寻找变量a,如果找不到才去全局找。那么有没有一种办法可以绕过局部域,打印全局域的变量a呢,答案是声明我们要打印的变量来源。
#include // 全局域 int a = 10; int main() { // 局部域 int a = 0; printf("%d\n", a); // 在变量名称前加上:: 这样编译器就知道到全局域中寻找了 printf("%d\n", ::a); }
通过以上我们大概了解了域方面的知识,那么什么是namespac命名空间呢,简单的说就是一个我们可以自定义的域,在这个域中我们可以存放函数/变量等等,同时因为具有域的特性,我们在多人合作项目时,可以各种取一个命名空间,这样我们可以使用相同命名的函数或者变量了 。
namespace关键字,后面的ouyang1可以任意取名:
#include // 命名空间 namespace ouyang1 { int a = 15; } namespace ouyang2 { int a = 20; } int main() { printf("%d\n", ouyang1::a); printf("%d\n", ouyang2::a); }
当然在你需要使用什么内部成员时声明一下就可以了 ,以下时使用不同成员声明的代码表述。
namespace ouyang { // 变量 int a = 10; // 函数 int add(int x, int y) { return x + y; } // 结构体 struct student_name { char name[20]; }; // 枚举 enum { red = 1, blue, yellow }; } int main() { printf("%d\n", ouyang::a); printf("%d\n", ouyang::add(1, 3)); struct ouyang::student_name s1; printf("%d\n", ouyang::red); printf("%d\n", ouyang::blue); printf("%d\n", ouyang::yellow); }
命名空间的作用:
命名空间可以防止命名冲突的发生,同时每一个命名空间都相当于一个域,访问需要声明获得权限,简单说就相当于我们所划定的领域,这样的设计可以使我们在团队项目中避免冲突发生。
命名空间的展开:
那么我们每次去使用命名空间时,都需要在前声明会不会有点麻烦,为了解决这一问题,c++语法中还包含了命名空间的展开,展开代码如下:
// 命名空间 namespace ouyang { int a = 10; } // 命名空间的展开 using namespace ouyang;
展开命名空间,就相当于对编译器开放了该命名空间的访问权限,但是注意域的访问顺序还是存在先后的,首先编译器还是会到局部域中去寻找,其次才是全局域和命名空间域。
这种展开有好也有坏,好处是:我们可以随意访问命名空间内的成员,坏的一方面如果命名空间展开的成员过多,不可避免会产生命名冲突问题,如以下代码:
// 命名空间 namespace ouyang { int a = 10; } // 命名空间的展开 using namespace ouyang; int a = 0; int main() { printf("%d", a); return 0; }
由于展开命名空间后,编译器访问全局域和命名空间域的优先程度一致,所以编译器无法区分究竟因该访问哪一个。
命名空间的局部展开:
为了防止展开太多出现以上情况,c++语法中又提出了局部展开,就是展开到特定的成员,这样可以大大降低了命名冲突带来的报错,也方便快速查找问题。
局部展开代码展示:
// 命名空间 namespace ouyang { int a = 10; int b = 5; } // 命名空间的局部展开 using ouyang::b; int main() { printf("%d", b); return 0; }
有了局部展开后,我们以后想访问命名空间的谁再去展开,这样既可以优化代码的冗长度,又可以很好的控制使用。
C++的输入输出
- cout
- cin
- endl
前提:我们都知道c语言中使用输入输出函数scanf/printf需要包括头文件#include,同样c++语法中使用以上的函数也需要包含头文件#include 。
cout输出符
上一个知识点我们了解了命名空间,c++在使用头文件时,为了避免命名冲突,也给其中的成员创建了命名空间域用于保护,如我们要使用的输入输出等等的函数都包含着命名空间std中。
注意:c++是在c语言的基础上衍生的,所以可以适用c语言的语法
代码使用方式:
#include #include using namespace std; int main() { // 变量 int a = 10; double b = 13.14; char c = 'a'; // c语言的输入输出 printf("C语言:"); printf("%d %lf %c\n", a, b, c); // c++语言的输入输出 //