第一天,囫囵吞枣的把C++的基本概念撸了一遍
有几个地方不太理解,今天有针对性的学习一下
1、namespace
自定义命名空间,主要为了解决类、函数和全局变量的命名冲突问题。
调用某个命名空间里的符号时,需要使用格式:命名空间::符号名称
#include <iostream>
using namespace std;
namespace first
{
int var = 5;
}
namespace second
{
double var = 3.1416;
}
int main () {
cout << first::var << endl;
cout << second::var << endl;
return 0;
}
结果是
5
3.1416
两个全局变量都是名字都是var,但是他们不在同一个namespace中所以没有冲突。
关键字using可以帮助从namespace中引入名字到当前的声明区域
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using first::x;
using second::y;
cout << x << endl;
cout << y << endl;
cout << first::y << endl;
cout << second::x << endl;
return 0;
}
输出是
5
2.7183
10
3.1416
就如我们所指定的第一个x是first::x,y是second.y
namespace也支持嵌套
需要注意的时,尽量不要在头文件中使用using namespace,因为头文件的引用具有不确定性,因此一旦在头文件中整体using了某个namespace,那么有可能会造成名称污染。
总而言之,using namespace 应尽可能的限制在小范围的作用域内。
2、头文件与源文件
头文件的后缀:.h,不需要编译,主要用于变量和函数的声明,而不必完成具体的实现,起到一个接口的作用。
源文件的后缀:.cpp,需要进行编译,主要存放函数的具体实现。
我的理解是:
在C++中,任何的符号(函数或者变量)都需要事先声明之后才可以调用。
假设有两个cpp源文件A和B,在A中定义了函数AFun,那如果B中需要调用这个AFun的话,也需要用同样的格式进行声明,然后才可以调用到AFun。
如果这个AFun是一个使用率很高的函数,或者A中还有很多类似的函数,那么所有需要这些函数的源文件都要被迫进行一系列的声明
头文件就是解决这个问题的,将A中所有使用率比较高的函数声明编写成一个独立的头文件,那其他源文件只需include这个头文件即可,无需将里面的函数再声明一遍。
值得注意的是,如果在头文件中声明变量,应该加上 extern 前缀,否则如果有两个以上的源文件引用这个头文件时,会提示编译错误。
有一篇文章说的非常好,链接在此:http://blog.csdn.net/chillon_liao/article/details/44261921
3、extern
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
第一个文件:main.cpp
#include <iostream>
int count ;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
第二个文件:support.cpp
#include <iostream>
extern int count;
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
最后输出:
Count is 5
宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒