文档章节

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

Lennie002
 Lennie002
发布于 2015/10/07 12:23
字数 1050
阅读 166
收藏 1

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

© 著作权归作者所有

Lennie002
粉丝 8
博文 120
码字总数 64058
作品 0
大连
私信 提问
拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载

在我们学习C++的过程中,我们难免会遇到类,在类中有6个默认的函数,它们分别为:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载。 一、...

痴心不改
2017/11/05
21
0
百度地图(国际化)面试题

2016-03-30 14:30 参加百度地图(国际化)的面试。以下是面试后我总结出的题目: 1、关键字static的作用。 static可以修饰局部变量,全局变量,函数和类中的成员变量和成员函数。 static修饰...

lengfeng0313
2016/08/22
103
0
类的二三事

类 类的基本思想就是数据抽象和封装。数据抽象依赖于接口和实现。接口指类外成员对象可使用的函数接口。实现指类的成员函数和成员变量。封装实现了接口和实现的分离。 类本身就是一个作用域。...

sdoyuxuan
2017/04/07
0
0
C++ Primer Plus(十二)——类和动态内存分配

静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域运算符来指出静态成员所属的类。但如果静态成员是整型或枚举型const,则可以在类声明中初始化。 strlen返回字符...

吃一堑消化不良
2016/02/29
99
0
CUDA学习(六十九)

设备内存空间说明符: ,和内存空间说明符不允许用于: 类,结构和联合数据成员, 形参 在主机上执行的函数中的局部变量。 和变量隐含了静态存储。 和变量定义只能在命名空间范围(包括全局命...

night李
2018/02/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你知道多少this,new,bind,call,apply?那我告诉你

那么什么是this,new,bind,call,apply呢?这些你都用过吗?掌握这些内容都是基础中的基础了。如果你不了解,那还不赶快去复习复习,上网查阅资料啥的! 通过call,apply,bind可以改变thi...

达达前端小酒馆
今天
5
0
设计模式之命令模式

命令模式的类图 其中的角色有: Client 客户端。只依赖于调用者Invoker、接收者Receiver、以及Command(网上找的图片这里没有画出来),不用关注接收者如何执行命令,只需要告诉调用者需要执行...

陈年之后是青葱
今天
7
0
2. 彤哥说netty系列之IO的五种模型

你好,我是彤哥,本篇是netty系列的第二篇。 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。 简介 本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别。 何...

彤哥读源码
今天
5
0
OSChina 周四乱弹 —— 喵的波粒二象性

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 小小编辑推荐:《水墨兰亭》- 李志辉 《水墨兰亭》- 李志辉 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :卧室里采光要足够好,这样...

小小编辑
今天
37
1
前后端分离接口规范

最近在开发,遇到前后端关于Boolean类型的参数传参和接收的问题: 场景:后台会根据用户是否出车/是否出司机(Boolean类型)来决定后端的业务逻辑(比如费用的计算),前端使用JSON字符串类型...

code-ortaerc
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部