顶层作用域:
顶层作用域就是从声明点延伸到源程序文本结束
命名空间:
如果整个文件都是一个命名空间,直接在头部using就可以,比如常用的
using namespace std;
如果是局部使用这个命名空间的话是
namespace std {
...
}
头文件
首先规范应该是:
头文件(a.h):声明函数或者类
与头文件命名相同(没有必要,但是为了规范)的cpp文件(a.cpp):头文件中声明的函数的实现 (该cpp的头部要include头文件)
自己的代码(b.cpp)使用头文件的时候,直接include头文件
编译的时候:
g++ a.cpp b.cpp
编译时链接a.h和a.cpp(为什么说是链接呢?因为函数的实现是在a.cpp,但是自己的代码只包含了a.h)
举个例子:
只有函数的头文件:
Car.h:
#include <iostream> //为了实现函数的时候cout会用到
void print();
Car.cpp:
#include "Car.h"
using namespace std;
void print () {
cout << "123\n";
}
Test.cpp:
# include "car.h"
using namespace std;
//void print();
int main() {
print();
cout << "end" << endl;
}
基本用法如上;
注意的是,我在Car.h里面include了iostream,所以我的Car.cpp里可以直接用cout, 同理,在Test.cpp里也可以直接用;
但是我们自己写代码会习惯性的加上
#include <iostream>
会不会重复呢?
同样我们去看看源码,路径:
/usr/include/c++/4.2.1/iostream
是不是看到了开头两行和最后一行是:
#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1
...
...
...
#endif /* _GLIBCXX_IOSTREAM */
_GLIBCXX_IOSTREAM仅作为标识符,没有实际意义;
如果我们在定义头文件的时候也在头和尾加上这样的标识,那就不怕重复包含了,所以我们自己加上iostream也无所谓;比如说刚刚的a.h可以这样定义:
#ifndef TEST
#define TEST
#include <iostream>
void print();
#endif
然后上述的Test.cpp里的第4行的注释,如果我想要重复声明一次这个函数可以吗?结果是可以的,但是只能是类外的函数,因为类函数只能在类内声明
;但是所有的函数只能定义一次(不是重载)
类头文件:
举个例子:
Car.h:
class Car {
private:
int size;
int price;
public:
Car(int, int);
Car();
int getSize();
int getPrice();
};
Car.cpp:
#include "Car.h"
Car::Car(){}
Car::Car(int s, int p) {
this->size = s;
this->price = p;
}
int Car::getSize() {
return this->size;
}
int Car::getPrice() {
return this->price;
}
Test.cpp:
# include <iostream>
# include "car.h"
using namespace std;
int main() {
Car a(5, 8);
cout << a.getSize() << endl;
}
类比一下,其实也不难吧~