参考自《C++ primer plus 6th edition》
程序对内存的使用:
链接: http://zhidao.baidu.com/link?url=An7QXTHS ZF7zN9rAuY05mvaHHar0xIpgK6Yqp9oAkm2GmZYoTAz9UpN4JuhWJvSLsbu0-lOcO47PzXcNWda6gK
定义静态成员变量:
可以在类声明中定义静态成员变量,使用 static 修饰。不过,虽说是成员变量,但是不属于这个类的任何一个对象。它们是是分开存储的。
因为对所有对象,这个变量的值都是一样的,存储上也只用存一份就好。访问的时候,使用 "className::varName" 即可。绝大多数语言中可以定义静态变量,只是法上稍有不同。Java中的静态变量,既可以通过对象来访问,也可以通过类来访问。C++中就只能通过类名来访问。不过,Java通过对象来访问静态变量,实质上是通过类名来访问的。好吧,这个问题无关痛痒。
其次,C++不允许在类声明中初始化静态成员变量。而且初始化的时候要使用作用域运算符,"className::varName"。一种"内部"的感觉。
在类中定义常量:
#include <iostream> class Student { public: const int id; Student(int ID) : id(ID) { } }; int main() { Student a(10); // a的id常量为10 Student b(20); // b的id常量为20 std::cout << a.id << " " << b.id << std::endl; }View Code
成员初始化列表的初始化工作,是在 对象创建后,构造函数函数体的代码执行前 做的。对于内置类型成员的初始化,不管是放在初始化列表中初始 化,还是放在函数体中初始化,效率是一样的。不过,对于对象成员来说,使用初始化列表来初始化,效率更高。暂且不提。要注意的一点是: 成员初始 化列表只能用于构造 函数 。
复制构造函数 与 赋值运算符:
基本概念:
考虑两种情况:
其他的的内存分配、回收问题
将涉及定位new的使用。(不考虑内存不够用的情况)
一个简单的例子:
#include <iostream> #include <string> #include <new> using namespace std; class Student { private: string name; public: Student(const string& s): name(s) { } ~Student() { cout << name << " destroyed/n"; } }; int main() { double * buffer = new double[512]; Student *s1 = new (buffer) Student("Peter"); Student *s2 = new (buffer + sizeof(Student)) Student("Tom"); /* 下面两条语句将引发错误,后面delete[] buffer, * 导致同一块内存被释放两次*/ //delete s1; //delete s2; /*显式调用析构函数, 这里按栈的顺序了,其实都行,不走寻常路 o_O */ s2->~Student(); s1->~Student(); delete[] buffer; return 0; }View Code