1. 面向对象
编程的文件结构:
1)头文件 .h, 包含类的定义。
2)源文件 .cpp, 类的成员函数,
3)源文件 .cpp, 编写主函数
2. C++为了节省内存,将成员函数的代码存储在计算机内存的一个公用区中,以供该类的所有对象共享。
3. 对象初始化:1)用成员函数 putXxx 2)用构造函数。
4. delete 用法
delete 指针名 // 变量 delete *p
delete []指针名 // 一维数组 delete []p;
delete [行数]指针名 // 二维数组 delete [5]p;
只要程序中,有用new动态分配空间,那么结尾的时候,必须要用delete释放内存空间。
5. C++有三种权限 public private protect,只有public是可以在类外直接访问的,默认权限是private
6. '::' 域运算符,就是表明成员变量或是成员方法是属于那个类的。
7. 关于this指针。
如下函数
void student::put(int id, char *name, student *const this)
{this->id=id;...}
this是指向本对象的只读指针,是一个隐含的形参.由系统在幕后自动设置,自动维护。
如果想返回当前对象,可用 return *this;
8. 构造函数,可以在构造函数中实现初始化,注意:构造函数前面不能加上void,否则出错!
如果重载了构造函数,那么系统就不会自动生成构造函数了。
所以只要重载了构造函数,最好写上无参的构造函数,这是一个好习惯。
9. 拷贝函数,就是为了对象间的拷贝,默认的拷贝函数会执行拷贝工作。
拷贝函数形式
类型::类名(类名 &对象别名)
{...}
如:
A a;
A b(a);
A c = a;
以上都实现了对象的复制,我暂时想不出有什么区别。
10. 析构函数, 在对象消亡的时候,自动调用,默认的析构函数什么都不做。
A a1;
A *a2 =new A();
程序结束的时候,a1 会自动调用析构函数,而a2不会自动调用析构函数!
我觉得可能是a1在栈内存中,运行结束后,弹栈,所以对象消失,会自动调用析构函数
而a2的声明在栈内存中,而实例化new A()分配在堆中,弹栈的时候,a2会消失,但是new A()不会消失。
所以没有调用析构函数。需要用 delete *a2 释放。
11.预编译
#ifdef DEBUG
可以进行debug测试
#endif
以上的语句可以用于debug测试,如果不想执行debug里面的语句,可以将前面的定义值去掉就行了。
12. static 声明的语句,只会执行一次。
如:
for (i=0; i<10; i++)
{
static int b=0;
b++;
cout<
} // 可以看到b的值是不停增大的,意味着用static修饰的声明语句只执行了一次!