构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)
十四 构造函数和初始化表
...
初始化表
)语法形式
class 类名{
类名(形参表):成员变量1(初值),...{}
};
)必须要使用初始化表的场景
--》如果有类 类型的成员变量,而该类又没有无参构造函数,则必须通过初始化表来初始化该成员变量。
--》类中包含"const"和“引用”成员变量,必须在初始化表中显式的初始化。
注:成员变量的初始化顺序由声明顺序决定,而与初始化表的顺序无关。 练习:使用初始化表为电子时钟类增加计时器功能。
如果使用日历时间初始化时钟对象,表现为时钟功能。
如果以无参的方式构造时钟对象,通过构造函数的初始化表将时分秒初始化为0::,表现为计时器功能。 十五 this指针与常函数
this指针
)类的成员函数和构造函数中都有一个隐藏的类 类型指针参数,名为this.
--》对于普通的成员函数,this指针就是指向调用该函数的对象。
--》对于构造函数,this指针指向正在被创建的对象 )需要显式使用this的场景
--》区分作用域
--》从成员函数返回调用对象的自身(返回自引用)
--》从类的内部销毁对象自身 常成员函数(常函数)
)在一个普通成员函数后面加上const 关键字,这个成员函数就称为常函数。
返回类型 函数名(形参表) const {函数体}
)常函数中的this指针是一个常指针,不能在常函数中修改成员变量的值。
注:被mutable关键字修饰的成员变量可以在常函数中被修改。
)非 常对象既可以调用常函数也可以调用非 常函数,但是常对象只能调用常函数,不能调用非 常函数。
)函数名和形参表相同的成员函数,其常版本和非常版本可以构成重载关系,常对象调用常版本,非常对象调用非常版本。 -------------
十六 析构函数(Destructor)
语法形式
class 类名{
public:
~类名(void){//清理对象在创建分配的动态资源}
};
)函数名必须是"~类名"
)没有返回类型,也没有参数,不能被重载。
)主要负责清理对象在创建分配的动态资源。 当对象被销毁时,析构函数将自动被执行
)栈对象当其离开作用域时,其析构函数被作用域终止的右花括号"{"调用。
)堆对象的析构函数被delete运算符调用。 如果一个类没有显式定义析构函数,那么编译器会为该类提供一个缺省的析构函数;
-->对基本类型的成员变量什么也不做
-->对类类型的成员变量,会调用相应的析构函数 对象的创建和销毁过程
)对象的创建
--》分配内存
--》构造成员子对象
--》执行构造函数代码
)对象的销毁
--》执行析构函数代码
--》析构成员子对象
--》释放内存
================================
十七 拷贝构造和拷贝赋值
浅拷贝和深拷贝
)如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝。
)浅拷贝将导致不同对象之间的数据共享,如果数据存放在堆区,可能会在析构时引发"double free"异常,因此就需要自己定义一个支持复制指针指向的内容的拷贝构造函数,即深拷贝。 练习:自定实现String类,支持深拷贝构造
class String{
public:
//构造函数
String(const char* str = ""):
m_str(
strcpy(new char[strlen(str)+],str)){
/*
m_str = new char[strlen(str)+1];
strcpy(m_str,str);
*/
}
//析构函数
~String(void){
delete[] m_str;
m_str = NULL;
}
//深拷贝构造 //提供访问接口函数
const char* c_str(void)const{
return m_str;
}
private:
char* m_str;
};
int main(void)
{
String s1("Hello");
String s2 = s1;//拷贝构造
cout << s1.c_str() << endl;//Hello
cout << s2.c_str() << endl;//Hello
return ;
}
构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)的更多相关文章
- 类的定义与实例化、构造函数和初始化表(day04)
十三 类的定义与实例化 类的一般形式 class/struct 类名:继承表{ 访问控制限定符: 类名(形参表):初始化表{}//构造函数 ~类名(void){}//析构函数 返回类型 函数名(形参表 ...
- 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)
十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- C++学习之普通函数指针与成员函数指针
函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...
- C++学习8 构造函数的参数初始化表
构造函数是一种特殊的成员函数,在创建对象时自动执行,主要用来进行初始化工作,例如对 private 属性的成员变量赋值. 对成员变量的初始化,除了在构造函数的函数体中一一赋值,还可以采用参数初始化表. ...
- 2.8 C++参数初始化表
参考:http://www.weixueyuan.net/view/6340.html 总结: 参数初始化表可以为任何数据成员进行初始化. 初始化const成员变量的唯一方法只有利用参数初始化表. 通 ...
- 赋值运算符、拷贝初始化和this指针
一.赋值运算符和拷贝构造函数(重载技术) 赋值运算符和拷贝构造函数有编译器默认提供,但如果想做更复杂的事,需要重载. 1.下面用一个简单的例子先区分一下赋值运算符和拷贝构造函数: #include&l ...
- C++成员变量、构造函数的初始化顺序 [转]
C++成员变量.构造函数的初始化顺序 一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静 ...
- C++成员变量、构造函数的初始化顺序
一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...
随机推荐
- PHP array_intersect_key()
定义和用法 array_intersect_key() 函数使用键名比较计算数组的交集. array_intersect_key() 返回一个数组,该数组包含了所有出现在被比较的数组中并同时出现在所有 ...
- h5 播放器 -3
autoplay <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- ios 导航栏(自己定义和使用系统方式)
系统方式: //1.设置导航栏背景图片 [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] ini ...
- HDU 5387 Clock (MUT#8 模拟)
[题目链接]:pid=5387">click here~~ [题目大意]给定一个时间点.求时针和分针夹角,时针和秒针夹角,分针和秒针夹角 模拟题,注意细节 代码: #include&l ...
- Buy or Build (poj 2784 最小生成树)
Buy or Build Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1348 Accepted: 533 Descr ...
- Linux vs Window
目前国内Linux更多的是应用于服务器上,而桌面操作系统更多使用的是Window.主要区别如下: 比较 Windows Linux 界面 界面统一,外壳程序固定所有Windows程序菜单几乎一致,快捷 ...
- SQL 优化记录
1. 对Where 语句的法则 1.1 避免在WHERE子句中使用in,not in,or 或者having. 可以使用 exist 和not exist代替 in和not in. 可以使用表链接代 ...
- B1001 狼抓兔子 最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- JavaScript 函数 伪数组 arguments
一.函数 函数:函数就是将一些语言进行封装,然后通过调用的形式,执行这些语句. 函数的作用: 1.将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重复劳动 2.简化编程,让变 ...
- Elasticsearch之批量操作bulk
1.bulk相当于数据库里的bash操作. 2.引入批量操作bulk,提高工作效率,你想啊,一批一批添加与一条一条添加,谁快? 3.bulk API可以帮助我们同时执行多个请求 4.bulk的格式: ...