十四 构造函数和初始化表
...
初始化表
)语法形式
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. ubuntu下的代码格式化工具

    indent -kr -i4   SimpleMail.java 可以用,但是太简单 astyle 这个工具不错 http://astyle.sourceforge.net/ astyle --sty ...

  2. 在shell脚本中使用函数的返回值

    #!/bin/bash - function mytest() { echo "arg1 = $1" if [ $1 = "1" ] ;then return ...

  3. [Vue-rx] Access Events from Vue.js Templates as RxJS Streams with domStreams

    The domStreams component property enables you to access Events from your Vue.js templates as Streams ...

  4. 南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜

     他出自军营,拥有一身正气. 他在南昌创业,立意卓越. 从站点開始.到微营销.到线上教育,全面开花. 他在朋友圈看到不对的内容,就会即时批评. 他对朋友,又是很的和蔼可亲. 他就是南昌华罡网络创办 ...

  5. js获取单独一个checkbox是否被选中

    <script language=javascript> function check(){ var xz=document.getElementById("xz"); ...

  6. Fragment进阶(四)-----&gt;參数传递3种写法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  7. hdu(1114)——Piggy-Bank(全然背包)

    唔..近期在练基础dp 这道题挺简单的(haha).可是我仅仅想说这里得注意一个细节. 首先题意: 有T组例子,然后给出储蓄罐的起始重量E,结束重量F(也就是当它里面存满了零钱的时候).然后给你一个数 ...

  8. The Elder HDU - 5956

    /* 树上斜率优化 一开始想的是构造出一个序列 转化成一般的dp但是可能被卡 扫把状的树的话可能变成n*n 其实可以直接在树上维护这个单调队列 dfs虽然搞得是一棵树,但是每次都是dfs到的都是一个序 ...

  9. JS基础之开篇

    JavaScript是解释型语言,无需编译就可以随时运行,这样哪怕语法有错误,没有语法错误的部分还是能正确运行. 1.JavaScript能做什么? 01, javaScript可以进行表单验证 如果 ...

  10. hdu4738Caocao's Bridges

    什么?有人要炸我的桥?!D飞他(心疼周瑜大都督) 这个就是求割边/桥了. #include<cstdio> #include<iostream> #include<cst ...