转载

C++ 学习笔记之---类和动态内存分配

参考自《C++ primer plus 6th edition》

程序对内存的使用:

链接: http://zhidao.baidu.com/link?url=An7QXTHS ZF7zN9rAuY05mvaHHar0xIpgK6Yqp9oAkm2GmZYoTAz9UpN4JuhWJvSLsbu0-lOcO47PzXcNWda6gK

C++ 学习笔记之---类和动态内存分配

定义静态成员变量:

可以在类声明中定义静态成员变量,使用 static 修饰。不过,虽说是成员变量,但是不属于这个类的任何一个对象。它们是是分开存储的。

因为对所有对象,这个变量的值都是一样的,存储上也只用存一份就好。访问的时候,使用 "className::varName" 即可。绝大多数语言中可以定义静态变量,只是法上稍有不同。Java中的静态变量,既可以通过对象来访问,也可以通过类来访问。C++中就只能通过类名来访问。不过,Java通过对象来访问静态变量,实质上是通过类名来访问的。好吧,这个问题无关痛痒。

其次,C++不允许在类声明中初始化静态成员变量。而且初始化的时候要使用作用域运算符,"className::varName"。一种"内部"的感觉。

在类中定义常量:

C++ 学习笔记之---类和动态内存分配

C++ 学习笔记之---类和动态内存分配
#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

成员初始化列表的初始化工作,是在 对象创建后,构造函数函数体的代码执行前 做的。对于内置类型成员的初始化,不管是放在初始化列表中初始 化,还是放在函数体中初始化,效率是一样的。不过,对于对象成员来说,使用初始化列表来初始化,效率更高。暂且不提。要注意的一点是: 成员初始 化列表只能用于构造 函数

复制构造函数 与 赋值运算符:

C++ 学习笔记之---类和动态内存分配

基本概念:

C++ 学习笔记之---类和动态内存分配

C++ 学习笔记之---类和动态内存分配

考虑两种情况:

C++ 学习笔记之---类和动态内存分配

其他的的内存分配、回收问题

将涉及定位new的使用。(不考虑内存不够用的情况)

C++ 学习笔记之---类和动态内存分配

一个简单的例子:

C++ 学习笔记之---类和动态内存分配
#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
正文到此结束
Loading...