C++随记(十)--类与对象(2)

C++随记(十)--类与对象(2)

1、  类的构造函数

类的数据成员是不能在声明类的时候初始化的!因为类不是一个实体,是一种抽象类型,并不占存储空间。C++为我们提供了一个特殊的成员函数---类构造函数,专门用于构造新对象,来处理对象的初始化问题

这个成员函数不需要用户来调用它,而是在建立对象的时候自动执行。

一般构造函数都如下方式进行定义(名称与类名相同):

比如有一类 Country,那么其构造函数可以定义为:

Country::Country()

{

对成员赋初值的操作…

} 可以在类中定义,也可以在类外定义。但一定要在类中进行声明

还可以定义带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的传递给构造函数,以实现不同的初始化:

比如可以在类中声明两个不同的构造函数:

public:

Country(); //这个一般叫做默认构造函数,它不包含任何参数,一个类中只能有一个默认构造函数

Country( int area; int population);//通过函数重载来实现另一个构造函数

另外,在定义含参数的构造函数时,可以将它设置为参数初始化列表来对成员进行初始化。这种方法不在函数体内对数据成员进行初始化,而是在函数首部。

2、  析构函数

析构函数的作用与构造函数相反,析构函数并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。析构函数无返回值,无函数类型,无任何参数。不能被重载。所以一个类可以有多个构造函数但是有且只能有一个析构函数。

定义一般如下(函数名是类型名前面添一个 ~):

Country:: ~Country()

{

}

可以将其编写为不执行任何操作,函数会自动在合适的时候调用它。

当然也可以在其中编写最后一次使用对象之后想要执行的一些操作,比如输出啊什么的。

3、  构造函数和析构函数的顺序

有这么一句话: ”先构造的后析构,后构造的先析构”。大方向是对的但是也不全对,要具体分析

(1)定义的全局对象,它的构造函数在所有函数(包括main)执行之前调用。当main执行完毕,或执行exit函数时,才调用析构函数。

(2)如果调用的是局部自动对象,则建立对象时调用构造函数。在函数调用结束,对象释放时调用析构函数。

(3)如果在函数中调用静态(static)局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,函数调用结束时,对象并不释放,也不调用析构函数。只在main函数或调用exit函数结束时,才调用析构函数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Python入门之面向对象编程(四)Python描述器详解

本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法、静态方法和...

3497
来自专栏猿人谷

C++中指针和引用的区别

指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化后不能被改变,指针可以改变所指...

1967
来自专栏前端学习心得

闭包不过如此

1192
来自专栏程序员互动联盟

【答疑解惑】java中static关键字的作用

static方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,...

2867
来自专栏土豆专栏

Java面试之关键字

finalize()是Object的protected方法,子类可以覆盖该方法来实现资源清理工作,GC在回收对象之前调用该方法。

17910
来自专栏陈满iOS

iOS基础:全局变量·静态变量·局部变量·自动变量(static、extern、全局静态区、堆区、栈区)

区分三种变量的特点,如果只看声明位置和访问范围,肯定不够深刻的,需要进一步理解在内存中的不同。所以,这里我们来复习总结一下三种变量的特点,区分巩固基础知识。

863
来自专栏从流域到海域

Python dict(字典)

Python dict即字典,是一种非常有用的数据结构,相当于其他语言的Map,这种数据结构采用键值对(key-value)形式存储,具有非常快的查询速度...

2179
来自专栏杂文共赏

Go中没有按引用传递

在Go中两个变量共享同一块内存区域是不可能的。但是两个变量指向的实际存储位置是可以一样的,但这不同于两个变量共享相同的存储区域。

781
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java提高三】三大特性-多态

【Java提高】三大特性-多态 面向对象编程有三大特性:封装、继承、多态。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构...

3559
来自专栏腾讯IVWEB团队的专栏

你可能不知道的 ECMAScript 2016 的变化(英译)

与 ECMAScript 6(也称为ECMAScript 2015)相比,ECMAScript 2016 是对 JavaScript 语言规范的一个小更新。 ...

1340

扫码关注云+社区