1. 全局int型变量,如果不赋值,出始为0;局部变量如不赋值,初始值不确定。
2. 非定义的函数声明也可以写在局部作用域中,例如:
int main(void)
{
void print_time(int, int);
print_time(23, 59);
return 0;
}
这样声明的标识符
print_time
具有局部作用域,只在main
函数中是有效的函数名,出了main
函数就不存在print_time
这个标识符了虽然在一个函数体中可以声明另一个函数,但不能定义另一个函数,C语言不允许嵌套定义函数
3. 一般的编译器不支持变量作为数组的长度,如以下语句会编译不过:
int arrLength = 10;
int myArray[arrLength];
但以下语句可以编译过:
const int arrLength = 10;
int myArray[arrLength];
原理: 函数内部的变量存放在stack中,而函数的stack必须预先确定大小,因此大多数编译器不允许用变量指定数组大小。而有的编译器,如g++支持“preceding declaration”,所以g++可以编译通过第一段代码。
那么,如何才能动态确定数组大小呢? 参照如下代码:
int* myArray;
int arrLength = 10;
myArray = new int[arrLength];
//一些数组操作
delete[] myArray; //最后别忘了清除heep中的数组存储空间
原理: new int[arrLength]是在heap中创建数组的存储空间,而在堆中,只创建了一个数组指针,后来又指向了占内存中的数组存储控件。实现了动态确定数组大小。
4. 传值、传指针、传引用、常量引用
//传值
void addOne(int i)
{
i++; // Has no real effect because this is a copy of the original
}
//传指针
void addOne(int* i)
{
*i++; // Actually changes the original variable
}
//传引用
void addOne(int& i)
{
i++; // Actually changes the original variable
}
//常量引用
void constRef(const int& i)
{
//常量引用的作用: 对参数产生一个不可变更的引用(而不是拷贝)
//Do something …
}
5. g++ 编译和连接
我写了三个文件:
student.h 声明了一个student类
student.cpp 定义了student类的实现
testStudent.cpp 包含主函数,创建并使用student类的对象
生成可执行程序的步骤:
1. 先编译成目标文件:
g++ –c *.cpp
目录中多了两个文件: student.o testStudent.o
2. 对目标文件进行连接:
g++ *.o
6. 对象创建
1. 如果类有默认构造方法,那么 在声明变量时,对象会自动创建:
AClass aObj;
aObj.aMethod();
2. 如果类没有构造方法,那么在声明时,必须指定参数:
AClass aObj("xxx",123);
aObj.aMethod();
3. 也可以使用new关键字创建一个对象,new表达式的值是一个指向对象的指针:
AClass* aObj = new aObj();
aObj->aMethod();
4. 使用new和不用new的区别:
如果不用new,是在栈中分配内存空间, 随着函数的结束, 空间被释放
如果用new,是在堆中分配内存空间,函数结束后,空间不会被释放,除非使用delete关键字对变量进行回收