码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-31 23:06:42      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:

参考自《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;
}
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

 

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

标签:

原文地址:http://www.cnblogs.com/zhangzph/p/4542767.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!