参考自《C++ primer plus 6th edition》
请各位放大观看吧,感觉博客园的编辑器有点坑。用图片之后,又发现太小,所以...
程序对内存的使用:
链接:http://zhidao.baidu.com/link?url=An7QXTHSZF7zN9rAuY05mvaHHar0xIpgK6Yqp9oAkm2GmZYoTAz9UpN4JuhWJvSLsbu0-lOcO47PzXcNWda6gK
定义静态成员变量:
可以在类声明中定义静态成员变量,使用 static 修饰。不过,虽说是成员变量,但是不属于这个类的任何一个对象。它们是是分开存储的。
因为对所有对象,这个变量的值都是一样的,存储上也只用存一份就好。访问的时候,使用 "className::varName" 即可。绝大多数语言中可以定义静态变量,只是法上稍有不同。Java中的静态变量,既可以通过对象来访问,也可以通过类来访问。C++中就只能通过类名来访问。不过,Java通过对象来访问静态变量,实质上是通过类名来访问的。好吧,这个问题无关痛痒。
其次,C++不允许在类声明中初始化静态成员变量。而且初始化的时候要使用作用域运算符,"className::varName"。一种"内部"的感觉。
在类中定义常量:
1. 编译时确定的常量
存储: 对所有对象而言,这个常量都是一样的。因此和对象分开存储,仅保留一份副本。
实现: 1. 枚举: 如 enum {SIZE = 100 }; 这就定义了一个枚举常量 SIZE = 100。
当然,你可以定义多个,并给定类型名。
2. 静态成员变量: 如 const static int a = 5;
3. 用const限定并初始化, 如声明成员 const int id = 5 (C++ 11 拓展)
2. 运行时确定的常量
存储: 不同对象,可以有不同常量,属于对象的普通成员
实现: 声明用const修饰的成员,然后用构造函数的成员初始化列表.
#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; }
成员初始化列表的初始化工作,是在对象创建后,构造函数函数体的代码执行前做的。对于内置类型成员的初始化,
不管是放在初始化列表中初始化,还是放在函数体中初始化,效率是一样的。不过,对于对象成员来说,使用初始化列表
来初始化,效率更高。暂且不提。要注意的一点是: 成员初始化列表只能用于构造函数。
复制构造函数 与 赋值运算符:
基本概念:
考虑两种情况:
其他的的内存分配、回收问题
将涉及定位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; }