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

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

时间: 2024-11-01 22:33:51

C++ 学习笔记之---类和动态内存分配的相关文章

C++ primer plus读书笔记——第12章 类和动态内存分配

第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化. P426-P427类静态成员的声明和初始化 //strnbad.h class StringBad { private: static int num_strings; … }; //strnbad.cpp int StringBad::num_strings = 0; 不能在类声明中初始化静态

《C++ Primer Plus》读书笔记之十—类和动态内存分配

第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分.注意:静态成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或枚举型const,则可以在类声明中初始化. 2.当使用一个对象来初始化另一个新建对象时,编译器将自动生成一个复制构造函数,因为它创建对象的一个副本.复制构造函数的

C++-类和动态内存分配 大发彩_票平台开发

大发彩_票平台开发 地址一:[hubawl.com]狐霸源码论坛地址二:[bbscherry.com] 类和动态内存分配 动态内存和类 C++在分配内存时是让程序在运行时决定内存分配,而不是在编译时决定. 这样,可根据程序的需要,而不是根据一系列严格的存储类型规则来使用内存.C++使用new和delete运算符来动态控制内存. 1.1. 复习示例和静态类成员 这个程序使用了一个新的存储类型:静态类成员. //strngbad.h#include<iostream>#ifndef STRNGBA

类和动态内存分配

类和动态内存分配 整理自<C++ Primer Plus> 1. 动态内存和类 静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享同一个静态成员.静态数据成员在类声明中声明,在包含类方法的文件中初始化. 复制构造函数用于将一个对象复制到新创建的对象中.也就是说,也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中.按值传递意味着创建原始变量的一个副本.由于按值传递对象将调用复制构造函数,因此应该按引用传递对象.这样可以节省调

《C++ Primer Plus》12.6 复习各种(类和动态内存分配的)技术 笔记

12.6.1 重载<<运算符要重新定义<<运算符,以便将它和cout一起用来显示对象的内容,请定义下面的友元运算符函数:ostream & operator<<(ostream & os, const c_name & obj){    os << ...;  // display object contents    return os;}其中,c_name是类名.如果该类提供了能够返回所需内容的公有方法,则可在运算符函数中使用这些

C++拾遗(十)类与动态内存分配(2)

静态成员函数 声明时包含关键字static.注意以下两点: 1.使用静态成员函数时不能通过对象或者this指针来调用,只能使用类名+作用域解析符来调用. 2.静态成员函数只能使用静态成员. new操作符 在使用 #include <new> 之后,new操作符可以在分配内存时指定内存位置.例如: 1 //创建一个512字节的内存缓冲区 2 char *buffer = new char[512]; 3 ClassName *ptr1, *ptr2; 4 5 //在buffer缓冲区中创建一个类

类与其动态内存分配

1. 类中的静态非常数数据( static , no const)需要在类外进行赋值,结构为 int class::varname = values ; 2. 类有五种特殊的函数类型: (1) 默认的构造函数 (2) 默认的析构函数 (3) 默认的复制构造函数 (4) 赋值运算函数 (5) 地址运算函数 (1): 默认的构造函数是一个没有参数,没有数据操作的函数 (2): 默认的复制构造函数是一个浅复制的函数,逐一复制非静态成员 (3): 默认的析构函数是一个没有任何操作的函数 (4): 默认的

C++学习笔记(十一):void*指针、类型转换和动态内存分配

void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”. 类型转换 C风格转换: 1 int i; 2 double d; 3 4 i = (int) d; 5 //或 6 i = int (d); C风格转换在C++中

C语言学习笔记--动态内存分配

1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* mallo