析构函数 this 静态成员变量 静态成员函数 const friend

1. 析构函数

1.    析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,那么编译器会自动生成。

2.  static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,

        只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。


3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。


#include <iostream>
#include <cstdlib>
using namespace std;

class Demo{
private:
    double n;
    double m;
    int i;
};

void func(){
    Demo *p = new Demo;
}

int main(){
    int i;
    for(i=1; i<=1000000; i++){
        func();
    }
   
    system("pause");
    return 0;
}

当程序运行到 system("pause"); 语句时,你可以打开任务管理器,会发现这个小小的程序竟然占用了 32M 内存。

这是因为每次调用 func 函数,都会创建一个对象,并用 p 指向它。函数运行结束,仅仅释放了指针变量 p 占用的内存,而没有释放 p 所指向的对象占用的内存。

如果在 func 函数中不回收对象内存,那么你将永远无法回收,只能等到程序运行结束(return 后)由操作系统回收,这就是典型的内存泄露。 (new,  delete  成对出现)

4     new delete  调用构造、析构函数

      malloc, free  不调用构造、析构函数

2. this

       1.  this 作为隐式参数,本质上是成员函数的局部变量,不占用对象的内存,只有在发生成员函数调用时才会给 this 赋值,函数调用结束后,this 被销毁。

         2.    成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。


3. static 成员变量

  1.  static 成员变量与对象无关,不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。static 成员变量和普通 static 变量一样,编译时在静态数据区分配内存,到程序结束时才释放。

  2. 静态成员变量必须初始化,而且只能在类体外进行。例如:初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化,一般是 0。静态数据区的变量都有默认的初始值,而动态数据区(堆区、栈区)的变量默认是垃圾值。

  3. int Student::num = 10;    //private, protected, public 初始化情况都一样。

4.  static 成员函数

1.    当调用一个对象的成员函数(非静态成员函数)时,系统会把当前对象的起始地址赋给 this 指针。

          静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没有 this 指针。既然它没有指向某一对象,就无法对该对象中的非静态成员进行访问。

可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有 this 指针,而静态成员函数没有 this 指针。由此决定了静态成员函数不能访问本类中的非静态成员。

4.  const

定义 const 对象的基本语法如下:

const  类名  对象名(实参名);
类名 const 对象名(实参名);

这两种定义方式都是可以的。一旦将对象定义为常对象之后,该对象就只能调用类中的常成员函数了。

对象生命为const对象后, 只能调用const 成员。


4.  friend 友元函数  友元类

http://c.biancheng.net/cpp/biancheng/view/211.html

你可能感兴趣的:(this,Const,friend,析构函数,静态成员变量,静态成员函数)