1.合理的程序分类
1)头文件:包含结构声明和使用这些结构的函数原型;
2)源代码文件:包含与结构有关的函数的代码;
3)源代码文件:包含调用上述函数的代码。
tip:1)头文件中通常包含 函数原型、#define或const定义的符号常量、结构声明、类声明、模板声明、内联函数。
2)包含自写的头文件时,使用“coordin.h”,而不是。因为文件名包含在尖括号时,c++将在存储标准文件的主机系统的文件系统中查找;但如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录,这会影响时间快慢。
2.好图:unix系统中的程序组合步骤
总结:*1 unix命令:CC file1.cpp file2.cpp;
*2 预处理器处理头文件;*3 编译器创建目标文件(temp1.cpp->file1.o); *4链接程序将目标代码.o文件、库代码和启动代码合并生成可执行文件a.out。
3.避免头文件多次定义
#ifndef TRY_H_
#define TRY_H_
......
#endif
4.确保所有对象文件或者库都是由一个编译器生成的。
5.存储性,作用域与链接
1)自动存储持续性
见如下代码:
#include<iostream>
using namespace std;
void oil(int x);
int main()
{
int texas = 31;
int year = 2011;
cout << "&texas: " << &texas << endl;
cout << "&years: " << &year << endl;
oil(texas);
cout << "&texas: " << &texas << endl;
cout << "&years: " << &year << endl;
}
void oil(int x)
{
int texas = 5;
cout << "&texas2: " << &texas << endl;
{
int texas = 113;
cout << "&texas3: " << &texas << endl;
}
}
函数中定义的变量
存储持续性:自动,函数结束时自动释放内存
作用域:局部
链接性:无
tip:如果在函数中添加作用域,定义同名变量,之前定义的变量会被隐藏,等到该作用域结束后变量会重新变得可见。
2)静态持续变量
存储持续性:静态(固定分配内存,不会在作用域结束撤销)
全局变量
作用域:整个文件 链接性: 外部
由于c++的单定义规则,即变量只能有一次定义,所以除了一次定义外,其它只能是声明。区别就是,定义会给变量分配存储空间,而声明不会。
//file01.cpp
extern int cats = 20; //定义,因为cats被初始化了
//file02.cpp
extern int cats; //声明,因为没有初始化
如果在程序的函数中再次定义 int cats = 30;
那么在该函数的作用域中,cats=30会隐藏之前的全局变量cats,但可以使用::cats来访问之前定义的全局变量。
局部变量
作用域:该文件 链接性:内部
static将定义的同名变量限定在单文件中,并且该静态变量将隐藏常规外部变量。
//file01.cpp
int errors = 20; //定义,因为cats被初始化了
//file02.cpp
static int errors = 5; //声明,因为没有初始化
cout << errors;
最后输出是5。
静态局部变量
作用域:该文件 链接性:无链接性
#include<iostream>
using namespace std;
void strinput(const char* str);
int main()
{
int texas = 3;
char input[10];
while (texas--) {
cout << "please enter" << (texas+1) << endl;
cin.get(input, 10);
cin.ignore(numeric_limits<streamsize>::max(), '\n');
strinput(input);
}
}
void strinput(const char* str)
{
int count = 0;
static int total = 0;
while (*str++)
{
count++;
}
total += count;
cout << count << " : " << total<<endl;
}
根据显示可以看到被定义为函数内部静态变量的total,即使在函数结束之后也会保存之前的值,等函数下次调用的时候使用。
tip:在使用cin.get(input,10)输入整行的时候,一种处理换行符的方法:
cin.ignore(numeric_limits::max(), ‘\n’);
6.说明符和限定符
说明符
auto:自动推断类型; register:显示指出变量是自动存储的;
static;extern;thread_local 线程;
cv-限定符
const :const在定义全局变量的时候和static是一样的效果,将链接性变为内部链接。
volatile: 即使程序代码没有对内存单元进行修改,其值也可能发生变化。避免程序进行将变量放入寄存器这种优化,直接从内存中提取。
mutable
如图,虽然定义的变量veep是const,不可修改的,但是由于accesses是mutable,所以仍然可以将accesses++。
7.语言链接性
C中,一个名称对应一个函数,如spiff翻译为_spiff。
C++中,由于有重载函数,可能将spiff(int)翻译为_spiff_i,spiff(double,double)翻译为_spiff_d_d。
可以用extern “C”void spiff(int);在C++文件中使用C语言链接性,这样可以保证某些C库的正常使用。
8.动态分配内存
定义: void *operator new(std::size_t);
void operator new ;
一个是分配数,一个分配数组。
定位new
1) p2 = new(buffer1) chaff
就是从buffer1中分配内存给chaff。
通常来说直接new chaff将在堆上直接创建内存空间,如果指定buffer
1就是按buffer1数组的首地址存储,可以使用
new(buffer+Nsizeof(double))来存储空间。
2)定位new不可使用delete。
3)定位new必须接受两个参数,字节数和地址。