首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++】This指针复制构造函数

注意给*this添加括号,因为.运算符优先级比较高 复制构造函数 复制构造函数普通构造函数有一些相似处,也没有返回值,类名作为函数名!...复制构造函数一种特殊构造函数,在创建一个新对象时将其他对象作为参数时, 编译器将会调用复制构造函数。不提供时使用默认构造函数。默认构造函数内部各个成员变量赋值。...CTime(CTime& time);//使用类名对象作为参数,传引用 调用复制构造函数时机: 在什么情况下使用复制构造函数 1.以其他对象作为参数创建新对象时。...比如:创建一个新对象时候,把原来一个对象作为参数传递给新对象作为构造函数 CTime time; CTime time2(time);//会自动执行复制构造函数复制成员等 CTime::...func(time);//第二次调用复制构造函数 复制给func中形参time CTime time3 = func1(time);//第三次第四次调用复制构造函数

80220

从零开始学C++之继承(二):继承与构造函数派生类转换

一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类中需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来类成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...派生类构造函数需要给构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象构造次序: 先调用类对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...四、派生类转换 当派生类以public方式继承类时,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为类对象指针 派生类对象引用自动转化为类对象引用

1.5K00
您找到你想要的搜索结果了吗?
是的
没有找到

C++复制构造函数赋值运算符

前言: C++面向对象编程过程中,凡是在类中运用到动态内存分配时候总是会写一个显示复制构造函数赋值重载运算符,本文将结合C++ Primer Plus一书内容分析下原因: 一、在C++编程中如果没有编写下列成员函数...浅复制会导致两个对象指针指向同一个内存单元,这时如果某个对象已经析构执行delete,那么剩下那个指针将会变成野指针,将造成灾难性后果。...3、默认复制运算符做了什么事情?    其实它默认赋值构造函数差不多,都是进行浅复制。...Str s2;s2=s1;这两句用到了赋值运算符,而浅复制导致s1s2指针指向了同一个位置,当s1被析构时候s2指向内存单元也被释放掉,所以再delete s2中str时候系统就崩溃啦。...程序中除了注意上述两点外还要注意构造函数是否全面,一开始写重载运算符=时候忽略了下面这个构造函数strlen,导致Str s2后一直报错,晕。。。

1.1K70

《挑战30天C++入门极限》图例实解:C++中类继承特性

我们知道,类对象操作时候在内部构造时候会有一个隐this指针,由于Car类是Vehicle派生类,那么当Car对象创建时候,这个this指针就会覆盖到Vehicle类范围,所以派生类能够对类成员进行操作...由上面的例程我们知道Car类是Vehicle类派生类(子类),c++规定,创建派生类对象时候首先调用构造函数初始化类成员,随后才调用派生类构造函数。   ...但是要注意是,在创建派生类对象之前,系统首先确定派生类对象覆盖范围(也可以称做大小尺寸),上面代码派生类对象a就覆盖于Vehicle类Car类上,至于派生类对象创建是如何构造类成员,我们看如下代码...+规定首先应该调用构造函数构造成员,在这里类成员构造是通过Vehicle(speed,total),来实现。   ...许多书籍对于派生类对象复制这一知识点多是空缺,为了教程易读性,我还是决定说一下在复制过程中容易出错地方,Car b=a;是派生类对象复制语句,通过前面教程学习我们我们知道,类对象复制是通过拷贝构造函数来完成

38520

c++学习笔记4,调用派生类顺序构造析构函数(一个)

大家好,又见面了,我是全栈君 测试源代码: //測试派生类构造函数调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace...endl; } }; 測试代码: int main() { A a; A *a1; cout<<"能够看到a1并没有调用构造函数..."<<endl; A *a2=new A; //仅仅有在new 一个对象时候才会调用构造函数 cout<<"能够看到...a3也并没有调用构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生类对象时候,首先调用类中构造函数,然后才是调用派生类自己构造函数...而在析构时候,顺序则刚好相反,先调用派生类析构函数,然后才是调用构造函数。这是由于对象创建时候对象存放在堆栈中原因。(new 对象尽管是存在堆中,可是在堆栈中依旧存放其堆中地址,因此。

67010

C++系列笔记(五)

抽象纯虚函数 不能实例化类被称为抽象类,这样类只有一个用途,那就是从它派生出其他类。在 C++中,要创建抽象类,可声明纯虚函数。...这让类可指定派生类中方法名称特征(Signature),即指定派生类接口。虽然不能实例化抽象类,但可将指针或引用类型指定为抽象类。...注意:C++关键字virtual含义随上下文而异(我想这样做目的很可能是为了省事),对其含义总结如下: 在函数声明中,virtual意味着当指针指向派生对象时,通过它可调用派生类相应函数。...可将复制构造函数声明为虚函数吗 根本不可能实现虚复制构造函数,因为在类方法声明中使用关键字virtual时,表示它将被派生类实现覆盖,这种多态行为是在运行阶段实现。...而构造函数只能创建固定类型对象,不具备多态性,因此C++不允许使用虚复制构造函数

64830

当类构造与析构时候...

构造/析构函数执行顺序 继承机制中对象之间如何转换? C++中类成员访问权限继承权限问题 如何禁止程序自动生成拷贝构造函数?...C++中structclass区别 什么时候会调用默认构造函数 1、当不使用任何初始值定义一个类非静态变量时,会调用该类默认构造函数。...向上类型转换 将派生类指针或引用转换为指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全。...向下类型转换 将指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个类对应几个派生类,所以向下类型转换时不知道对应哪个派生类,所以在向下类型转换时必须加动态类型识别技术...---- C++中structclass区别 相同点 两者都拥有成员函数、公有私有部分 任何可以使用class完成工作,同样可以使用struct完成 不同点 两者中如果不对成员不指定公私有,struct

61720

C++基础-继承

不过有两种例外情况,第一种:如果派生类构造函数构造函数参数表一样,则相当于派生类构造函数覆盖了构造函数,这种情况被覆盖构造函数无法被继承;第二种:默认、拷贝、移动构造函数不会被继承。...,派生类构造函数会隐式调用类默认构造函数,这由编译器实现,不需编写调用代码; 如果类没有默认构造函数,即类提供了重载构造函数,则派生类构造函数通过初始化列表来调用构造函数,这属于显式调用。...如果类包含重载构造函数,需要在实例化时给它提供实参,则创建派生类对象时,可以使用初始化列表,并通过派生类构造函数调用合适构造函数。...类内部包括类声明以及实现部分,类外部包括对当前类调用代码以及其它类声明及实现代码。 2.2 公有继承 公有继承特点是公有成员保护成员作为派生类成员时,它们都保持原来状态。...派生类指针可以赋值给指针,反之则不行。 因为派生类指针所指向内存块比指针所指向内存块大。指针可以指向派生类对象,取类大小内存即可。

94920

原型模式C++复制构造函数赋值运算符

这个可以从两个角度来说,第一,时间消耗角度:如果创建实例构造函数非常复杂,在执行这个构造函数时会消耗较长时间,这时如果需要一个跟刚刚实例化对象参数差不多实例(可以完全相同,也可以大部分相同)那么直接使用...因为类之间直接赋值的话,默认拷贝函数是进行引用赋值 对于指针复制会造糟糕结果,这点可以参见C++ primer plus "类动态内存分配"章节,也可以参见我另一篇技术博客 C++复制构造函数赋值运算符...4、所属类别:创建型 二、原型模式C++程序 1 // 原型模式.cpp : 定义控制台应用程序入口点。...2 // 3 4 #include "stdafx.h" 5 #include 6 using namespace std; 7 8 //声明一个虚拟类,所有的原型都从这个类继承...,需要供继承者自行实现 15 //为了测试而添加函数 16 virtual void show()=0; 17 }; 18 19 // 派生自Prototype,实现Clone

1.4K50

C++面向对象编程一些拾遗

noteL: 一般而言是不需要我们自己写拷贝构造函数赋值操作符C++编译器会自动帮我们生成这样功能函数,但是有一种情况我们必须定义自己拷贝构造函数赋值操作符,那就是:当数据成员有指针时候...note: 构造函数析构函数是不能被继承!!!正因为如此,我们还需要研究派生类构造函数析构函数。 九.派生类构造函数析构函数派生类构造函数。...派生类析构函数对象构造时候刚好是相反顺序。 对派生类新增普通成员进行清理。 调用成员对象析构函数。 调用类析构函数。 十.继承函数。 1. 覆盖函数。...虚拷贝构造函数(虚复制构造函数) 由于构造函数不能是虚,但是在某些需求下:需要通过传入一个指向指针(可以指向派生类对象)来获取派生类拷贝,这个时候就需要自己定义一个虚clone()函数来实现这种需求...可以看出,我们在构造一个flyhorse对象时候,发生了五次构造,其中类被构造了2次,二义性就是从这里产生C++解决这种问题方法是采用虚方法,也可以称作为虚继承。

63420

C++设计类注意事项

普通构造函数一样,如果你没定义复制构造函数,编译器将提供一个,旦最好显式地自己定义一个,对于一些用new初始化成员,自行用深复制来做复制,否则编译器提供只是简单复制,在删除时会出问题。...析构函数最好定义成虚函数(virtual),这样当释放一个指针指向派生类时,也会自动先调用派生类析构函数,然后才调用析构函数,否则会只调用析构函数,这样派生类用new初始化成员将得不到释放...另外,也由于C++支持用引用指向派生类时,对于虚函数会调用其真实类型函数,这保证了灵活使用。只是要注意如果在函数中不修改对象,最好用const修饰对象参数,避免修改。...虚函数意义是当用指针或引用指向对象时(不管指向类对象还是派生类对象),调用虚函数会根据对象真实类型调用对应方法。...,比如有一个类是“圆形类”,一个类是“椭圆形类”,为了方便可以定义一个“形状类”作为它们两个抽象类,持有一些比如圆心坐标等共有成员方法,但是你不能去创建一个“形状”对象来,没什么意义。

37620

C++查缺补漏

本文总结了几乎所有不易理解或是容易忘记C++知识,可作为手册查阅,内容参考自清华大学郑莉教授C++课程。...复制构造函数是一种特殊构造函数,其形参为本类对象引用,作用是用一个已存在对象去初始化同类型新对象 定义一个对象时,以本类另一个对象作为初始值,发生复制构造 如果函数形参是类对象,调用函数时...,由初始化列表提供参数 执行派生类构造函数体中内容 派生类复制构造函数 派生类未定义复制构造函数情况 编译器会在需要时生成一个隐含复制构造函数 先调用复制构造函数 再为派生类新增成员执行复制...派生类定义了复制构造函数情况 一般都要为复制构造函数传递参数 复制构造函数只能接受一个参数,既用来初始化派生类定义成员,也将被传递给复制构造函数 复制构造函数形参类型是类对象引用...,在32位机器上,指针占4个字节;在64位机器上,指针占8个字节 抽象类纯虚函数 纯虚函数是一个在类中声明函数,它在该类中没有定义具体操作内容,要求各派生类根据实际需要定义自己版本,纯虚函数声明格式为

2.5K10

常见ccpp面试题目汇总(一)

3、C++支持函数重载,C不支持函数重载 4、C++中有引用,C中不存在引用概念 二、C++指针引用区别: 1、 指针是一个新变量,存储了另一个变量地址,我们可以通过访问这个地址来修改另一个变量...关键字可有可无 override,派生类覆盖函数,实现接口重用;特征:不同范围(派生类)、函数名字相同、参数相同、类中必须有virtual关键字(必须是虚函数) overwrite,派生类屏蔽了其同名函数...,还没有内存空间,更没有虚函数表地址用来调用虚函数构造函数了 2、析构函数最好声明为虚函数 首先析构函数可以为虚函数,当析构一个指向派生类指针时,最好将析构函数声明为虚函数,否则可以存在内存泄露问题...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指向派生类指针时,只会调用析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。...因为引用(或指针)既可以指向类对象也可以指向派生类对象,这一事实是动态绑定关键。用引用(或指针)调用函数在运行时确定,被调用函数是引用(或指针)所指对象实际类型所定义

1.2K31

硬核 | C++ 基础大全

拷贝构造函数: 拷贝构造函数函数参数为对象本身引用,用于根据一个已存在对象复制出一个新该类对象,一般在函数中会将已存在对象数据成员值一一复制到新创建对象中。...赋值运算符重载 :注意,这个类似拷贝构造函数,将=右边本类对象复制给=左边对象,它不属于构造函数,=左右两边对象必需已经被创建。...因为派生类中都没有虚函数定义,那么编译器就会认为不用留给动态多态机会,就事先进行函数地址绑定(早绑定),详述过程就是,定义了一个派生类对象,首先要构造空间,然后构造派生类自身内容,形成一个派生类对象...也就是说构造派生类类部分是,编译器会认为这就是一个类类型对象,然后调用类类型中函数实现,并没有按照我们想要方式进行。即对象在派生类构造函数执行前并不会成为一个派生类对象。...深拷贝浅拷贝区别(举例说明深拷贝安全性) 当出现类等号赋值时,会调用拷贝函数,在未定义显示拷贝构造函数情况下, 系统会调用默认拷贝函数-即浅拷贝,它能够完成成员一一复制

1.1K10

C++指针数组,二级指针函数指针练习

1.编一程序,将字符串“Hello,C++!”赋给一个字符数组, 然后从第一个字母开始间隔地输出该串(请用指针完成)。...#include #include using namespace std; int main() { const char str[] = "Hello,C+...2.编写一个函数,用于去掉字符串尾部空格符。 函数原型为:char *mytrim(char *string); 其中参数string为字符串,返回值为指向string指针。..."The string is now long:" << c2 << endl; return string; } int main() { char str[] = "Hello,<em>C+</em>...3.编写一个<em>函数</em>,用于去掉字符串前面的空格。 <em>函数</em>原型为:char *myltrim(char *string); 其中参数string为字符串,返回值为指向string<em>的</em><em>指针</em>。

1.1K30

后台开发:核心技术与应用实践 -- C++

同时,无论哪一种继承方式,在派生类中是不能访问私有 成员,私有成员只能被本类成员函数所访问,毕竟派生类类不是同一个类 构造派生类对象时,必须对类数据成员、新增数据成员成员对象数据成员进行初始化...派生类构造函数必须要以合适初值作为参数,隐含调用新增对象成员构造函数,来初始化它们各自数据成员,然后再加入新语句对新增普通数据成员进行初始化。...派生类构造函数必须对这3类成员进行初始化,其执行顺序是这样: 先调用构造函数; 再调用子对象构造函数; 最后调用派生类构造函数体 当派生类有多个类时,处于同一层次各个构造函数调用顺序取决于定义派生类时声明顺序...在执行派生类析构函数时,系统会自动调用析构函数子对象析构函数,对子对象进行清理。...而 虚函数 作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数

1.3K10

C++之面向对象语法笔记

,如果需要将类对象作为形参,传入到某个函数进行调用,这种情况分为值传递引用传递。...拷贝构造函数通常用于: 通过使用另一个同类型对象来初始化新创建对象。 复制对象把它作为参数传递给函数复制对象,并从函数返回这个对象。 对拷贝,C++ String源码,最能体现。...这个已有的类称为类,新建类称为派生类C++ 继承继承指就是派生类关系。...protected 当一个类派生自保护类时,公有保护成员将成为派生类保护成员。 private 当一个类派生自私有类时,公有保护成员将成为派生类私有成员。...C++多态性用一句话概括就是:在函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象实际类型来调用相应函数

1.5K40

C++指针数组,二级指针函数指针练习

1.编一程序,将字符串“Hello,C++!”赋给一个字符数组, 然后从第一个字母开始间隔地输出该串(请用指针完成)。...#include #include using namespace std; int main() { const char str[] = "Hello,C+...2.编写一个函数,用于去掉字符串尾部空格符。 函数原型为:char *mytrim(char *string); 其中参数string为字符串,返回值为指向string指针。..."The string is now long:" << c2 << endl; return string; } int main() { char str[] = "Hello,<em>C+</em>...3.编写一个<em>函数</em>,用于去掉字符串前面的空格。 <em>函数</em>原型为:char *myltrim(char *string); 其中参数string为字符串,返回值为指向string<em>的</em><em>指针</em>。

1.4K100

C++】从零开始认识继承

寓意把派生类中父类那部分切来赋值过去。 类对象不能赋值给派生类对象。 指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须是指针是指向派生类对象时才是安全。...但是我们写了一个类Person全缺省构造函数,这里就会在没有传参时候没有默认构造函数匹配,这时派生类Student就会报错: 为了避免这样错误,我们可以增添派生类Student构造函数...总结 派生类默认成员函数注意事项: 派生类构造函数必须调用构造函数初始化那一部分成员。如果类没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。...派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 派生类operator=必须要调用operator=完成复制。...派生类析构函数会在被调用完成后自动调用析构函数清理类成员。因为这样才能保证派生类对象先清理派生类成员再清理类成员顺序。 派生类对象初始化先调用构造再调派生类构造

5110
领券