十四 构造函数和初始化表
...
初始化表
)语法形式
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)的更多相关文章

  1. 类的定义与实例化、构造函数和初始化表(day04)

    十三 类的定义与实例化 类的一般形式 class/struct 类名:继承表{ 访问控制限定符: 类名(形参表):初始化表{}//构造函数 ~类名(void){}//析构函数 返回类型 函数名(形参表 ...

  2. 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)

    十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...

  3. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  4. C++学习之普通函数指针与成员函数指针

    函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...

  5. C++学习8 构造函数的参数初始化表

    构造函数是一种特殊的成员函数,在创建对象时自动执行,主要用来进行初始化工作,例如对 private 属性的成员变量赋值. 对成员变量的初始化,除了在构造函数的函数体中一一赋值,还可以采用参数初始化表. ...

  6. 2.8 C++参数初始化表

    参考:http://www.weixueyuan.net/view/6340.html 总结: 参数初始化表可以为任何数据成员进行初始化. 初始化const成员变量的唯一方法只有利用参数初始化表. 通 ...

  7. 赋值运算符、拷贝初始化和this指针

    一.赋值运算符和拷贝构造函数(重载技术) 赋值运算符和拷贝构造函数有编译器默认提供,但如果想做更复杂的事,需要重载. 1.下面用一个简单的例子先区分一下赋值运算符和拷贝构造函数: #include&l ...

  8. C++成员变量、构造函数的初始化顺序 [转]

    C++成员变量.构造函数的初始化顺序 一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静 ...

  9. C++成员变量、构造函数的初始化顺序

    一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...

随机推荐

  1. 2015 测试赛 大神和小伙伴 hihoCoder

    立方和公式和平方和公式.表示从来不记得这些公式... 每库礼物不同数量相同,总数=1+2+...+n=(n+1)*n/2 选取礼物的可能性的最大值为[(n+1)*n/2]^3 选取礼物价值重复两次的总 ...

  2. T470 Win10下触摸板手势

    T470 Win10下触摸板手势 学习了:https://forum.51nb.com/thread-1742490-1-1.html 三指横向竟然是alt+tab 学习了:http://www.xi ...

  3. CocoaPods建立私有仓库

    项目管理:CocoaPods建立私有仓库 2015-05-08 10:22 编辑: lansekuangtu 分类:iOS开发 来源:agdsdl 0 6367 CocoaPods项目管理私有仓库 招 ...

  4. ExtJs4.1布局具体解释

    Border布局: Ext.onReady(function(){     Ext.QuickTips.init();     Ext.create('Ext.container.Viewport', ...

  5. &quot;Hello World &quot; —— 深入理解程序从编译到执行

    对于C语言编写的Hello World程序(例如以下).对于程序猿来说肯定如雷贯耳,就是这样一个简单的程序,你真的了解她吗? #include <stdio.h> int main() { ...

  6. Android 组件ContentProvider

    Android 组件ContentProvider Android的数据存储有五种方式Shared Preferences.网络存储.文件存储.外储存储.SQLite,一般这些存储都仅仅是在单独的一个 ...

  7. web.xml中load-on-startup

    <servlet> <servlet-name>SystemInit</servlet-name> <servlet-class>sjgl.system ...

  8. Asteroids(匈牙利算法)

    求最小点覆盖数,即最大匹配数,匈牙利算法. #include<stdio.h> #include<string.h> ][],vis[],linker[];//linker[] ...

  9. [Apple开发者帐户帮助]二、管理你的团队(1)邀请团队成员

    组织可以选择向其开发团队添加其他人员.如果您已加入Apple开发者计划,您将在App Store Connect中管理团队成员.有关详细信息,请转到在App Store Connect帮助中添加用户. ...

  10. C#格式化年月日截取

     //if (bm.Name == "DateYear") //年                 //{                 //    bm.Select();   ...