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

【C++】运算符重载案例 - 字符串 ① ( Visual Studio 创建 String | 构造函数与析构函数 | 完整代码示例 )

一、Visual Studio 创建 String 右键点击 " 解决方案资源管理器 " 的 解决方案 名称 , 弹出菜单 , 选择 " 添加 / " 选项 ; 输入 String 名...char* 类型字符串指针 String(const char* p); // 拷贝构造函数 , 使用 String 对象初始化 对象值 String(const String& s); /...strcpy(m_p, p); } cout << "调用有参构造函数" << endl; }; 4、拷贝构造函数 拷贝构造函数 , 使用 String 对象初始化 对象值 ; 首先 ,...(); // 有参构造函数 , 接收一个 char* 类型字符串指针 String(const char* p); // 拷贝构造函数 , 使用 String 对象初始化 对象值 String...strcpy(m_p, p); } cout << "调用有参构造函数" << endl; }; // 拷贝构造函数 , 使用 String 对象初始化 对象值 String::String(

20320

【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

地方 , 都可以使用 " 公有继承 " 的 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 应用场景 : 直接使用 : 使用 子类对象 作为 父对象 使用 ; 赋值 : 将 子类对象 赋值给 父对象 ; 初始化 : 使用 子类对象 为 父对象 初始化 ; 指针 : 父指针 指向...); } 2、使用 子类对象 为 父对象 进行初始化 定义父对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 使用 子类对象 为 父对象 进行初始化 Parent parent = child; 3、完整代码示例 #include "iostream" using namespace...类型兼容性原则 : 使用 子类对象 为 父对象 进行初始化 Parent parent3 = child; // 控制台暂停 , 按任意键继续向后执行 system(

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

C++打怪升级(五)- 和对象入门2

//空 class Date{ }; 一般设计一个时我们通常会定义的数据成员进行初始化函数数据成员进行销毁(比如动态申请空间的释放)的函数…这些函数实现了特定的功能,并且不是这一个独有的功能...,我们需要对进行初始化操作,以便于结构体成员进行初始化(分别为每一个成员赋予一个合理的初始值),这是非常有必要的操作,因为未初始化的变量往往是随机值,这可能会导致出乎意料的错误。...构造函数本质是成员变量的初始化,即构造的功能是成员变量的初始化。...如何解决即含(有自己的构造函数的)自定义类型又含内置类型,且需要对内置类型进行初始化的情况呢?...引子 再C语言中创建一个某一个类型的变量时往往会对初始化,其中有一种方式是使用已创建的变量新创建的变量进行赋值初始化

72820

剖析【C++】——与对象()——小白篇—超详解

1.的6个默认成员函数C++,即使一个没有定义任何成员或成员函数,编译器仍会为其生成以下6个默认成员函数。下面是这些默认成员函数的简易分析和代码示例。 1....以下是构造函数的详细解释和代码示例,帮助初学者深入理解原理和使用方法。 2.1 构造函数的概念 构造函数是一个特殊的成员函数,名字与名相同。...构造函数可以重载,使得对象不同的情况下被初始化。如果没有定义构造函数,编译器会生成一个默认的构造函数,但它对内置类型成员变量不进行初始化。...以下是析构函数的详细解释和代码示例,帮助初学者深入理解原理和使用方法。 3.1 析构函数的概念 析构函数构造函数功能相反,不是完成对对象本身的销毁,而是用于清理对象的资源。...5.赋值运算符重载详解 赋值运算符重载是C++运算符重载的一种形式,它允许我们自定义对象之间的赋值行为。以下是赋值运算符重载的详细解释和代码示例,帮助初学者深入理解原理和使用方法。

8910

【C++】和对象 (中篇)

,特别是第二个错误,可以说是十分普遍: 使用数据结构创建变量时忘记进行初始化操作而直接进行插入等操作; 使用完毕后忘记动态开辟的空间进行释放而直接返回; 而C++是C语言的基础上生长起来的...; C++11 针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量声明时可以给缺省值;缺省值的意思就是如果构造函数没有该变量进行初始化,那么该变量就会使用缺省值: C++11...:比如operator@; 重载操作符必须有一个类型参数 (因为运算符重载只能对自定义类型使用); 用于内置类型的运算符含义不能改变,即不能对内置类型使用运算符重载; 作为的成员函数重载时,形参看起来比操作数数目少...,自定义类型会去调用自身的赋值重载函数; 所以对于没有资源申请的来说,我们不用自己去写赋值重载函数,直接使用默认生成的即可,因为这种类只需要进行浅拷贝 (值拷贝),比如 Date : 注:拷贝构造函数完成的是初始化工作...,创建对象时自动调用;赋值重载完成的是已存在的对象之间的拷贝,需要手动调用;而上图中 Date d2 = d1 是创建 d2 并进行初始化,所以调用的是拷贝构造函数;d3 才是调用赋值重载函数

64900

【C++】与对象理解和学习(

我们把它放在后面一章来讲解关于初始化列表相关知识及注意点) 析构函数 析构函数的作用就是对象的资源进行清理,它的创建方式与构造函数大致相同: 析构函数名是名前加上字符 ~。...赋值运算符重载 运算符重载 C++为了增强代码的可读性引入了运算符重载,所谓运算符重载的用处是什么呢?实际上就是是我们的自定义类型也可以直接使用操作符进行操作。...就比如说,整型a大于整型b,我们可以直接用>进行判断,但是对于自定义类型来说,这里就不能直接使用>。 那么什么是运算符重载呢?...实际上运算符重载是具有特殊函数名的函数,也具有返回值类型,函数名字以及参数列表,返回值类型与参数列表与普通的函数类似。 函数名为:关键字operator后面接需要重载运算符符号。...,含义不能改变,例如:内置的整型+,不 能改变含义 作为成员函数重载时,形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this .* :: sizeof ?

52030

【C++】‘与对象‘-三部曲——(4)(23)

) 析构函数的主要任务是清理对象; 运作上看,当对象生命周期结束时,编译器会自动调用它 形态上看,名前加上~,且无返回值 注意点,析构函数不允许重载。...:例如operator@ 重载操作符必须有一个类型参数 用于内置类型的运算符含义不能改变:例如+ 作为成员函数重载时,形参看起来比操作数少一个(因为成员函数的第一个参数为隐藏的this) .*.../这五个运算符不能重载 一.运算符重载函数构造函数使用区别: 5.赋值重载函数(第四个的分支) 赋值运算符重载格式: 参数类型:const T& (传递引用可以提高传参效率) 返回值类型:T...(初始化只能初始化一次) 包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时 ) 缺省值与初始化列表的关系: (下列代码...五.成员变量初始化列表初始化顺序 成员变量声明次序就是初始化列表初始化顺序,与其初始化列表的先后次序无关 图示:

13310

和对象(

同时也对应了上面的条款:默认构造函数只能有一个 2.3 构造函数实现栈Stack的初始化 对于栈来说,初始化是必要的,但是我们创建栈的时候有可能忘记调用初始化,因此C++,我们可以通过构造函数自动的初始化...答:对于这个情况,当在Date给_aa初始化时,会调用其内部的函数,但是内部函数仍然是编译器默认的的构造函数,不会对进行我们想要的初始化,因此这样也是不符合需求的。...对于运算符重载的 ==来说,这种比较运算符两个参数进行操作的,即==的左面一个,右面一个。...: 因此,默认的赋值运算符重载函数,仍然可以进行对日期的拷贝,事实上,与拷贝构造的默认函数是相同的。...Stack的自定义运算符重载函数,因此可以调用,从这里可以看出,与拷贝构造函数的方式是一样的。

48900

C++初阶-和对象

C++和对象渐入之章 一、前言 二、的6个默认成员函数汇总 三、构造函数 四、析构函数 五、拷贝构造函数 六、赋值运算符重载 1、运算符重载 2、赋值运算符重载 七、日期的实现 八、const成员...,C++对此做出了优化,即在创建对象时自动调用初始化函数,也就是构造函数 概念: 构造函数是特殊的成员函数创建对象时对对象的成员变量进行初始化,创建类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值...,还是相当于不会处理 注:所以一般来说都建议自己写构造函数进行初始化成员变量 成员变量的命名风格 对于一般的命名来说一定的情况可能或造成命名冲突 示例: class Date {...(野指针),如果进行操作该空间(再次free等)则会造成程序崩溃 六、赋值运算符重载 1、运算符重载 引入: C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数,也具有返回值类型...将const修饰的成员函数称之为const成员函数,const修饰成员函数,实际修饰该成员函数隐含的this指针,表明该成员函数不能对的任何成员进行修改 相关问题: class Date

58820

【C++】和对象(第二篇)

有了构造函数,我们每创建完一个对象,就不用手动去调用Init函数进行初始化了,因为创建对象时编译器会自动去调用构造函数对对象进行初始化。 那构造函数到底是个啥呢?...这样的话内置类型不写构造函数就没法初始化了吗? ,我们的祖师爷呢在后来也发现了这个问题,并在C++11针对内置类型不初始化的缺陷打了一个补丁。 即非静态成员变量声明的时候可以给缺省值。...可不可以像上面的构造函数自动初始化一样自动对对象的资源进行清理呢?...,那经过了上面的学习,我们现在创建一个对象一般都直接用构造函数进行初始化,想初始化什么值传参就行了。 那现在我们想创建一个和d1一样的新对象,是不是可以用d1去初始化创建出来的新对象啊。...这就需要我们这些运算符进行重载

9810

C++之类和对象

(注:由于this指针成员函数需要被频繁调用,所以VS进行了优化,由编译器通过ecx寄存器传递) 相关面试题 1.this指针存在哪里?...使用传值方式编译器直接报错,因为会引发无穷递归调用; 3.若未显式定义,编译器会生成默认的拷贝构造函数; 4.默认的拷贝构造函数对内置类型以字节为单位直接进行拷贝 – 浅拷贝,自定义类型调用自身的拷贝构造函数...浅拷贝,自定义类型调用自身的赋值重载函数; 日期赋值重载的实现 赋值重载一般使用引用做参数(这里其实可以使用传值传参,但是传值传参要拷贝临时变量,所以为了提高效率还是使用引用做参数),并用const...,自定义类型调用自身的赋值重载函数;我们可以理解为:需要写析构函数就需要写赋值重载函数,不需要写析构函数就不需要写赋值重载函数。...>> 进行运算符重载,osteam 对流插入运算符 << 进行运算符重载,所以 cin 和 cout 对象能够完成数据的输入输出;同时,istream 和 ostream 进行运算符重载时还进行函数重载

1.1K00

【笔记】《C++Primer》—— 第三部分:设计者的工具

旧标准我们使用private版本的构造函数来控制构造,但如今如果要控制拷贝最好用=delete 我们一个的拷贝和资源管理通常表现为两种:像值的,像指针的。...,派生一般构造函数开始的地方调用基构造函数,让基初始化自己的成员 静态类型是变量本身代码的类型,在编译时决定,动态类型是变量在内存的对象的类型,在运行时才能决定。...定义方法是声明函数名的时候函数体类似显式默认构造的写法改写为=0,只能对虚函数使用这个写法 友元只对被声明的有效,友元的基或派生都不是友元 某个继承来的成员的访问权限受到两个因素的影响:...因此除了重载函数外最好不要让名称同名 派生可以覆盖基重载函数,但是如果派生希望基重载的几个函数都在派生可见的话:一种方法是不覆盖任何一个重载函数或将所有重载函数进行一次覆盖;另一种方法是为需要重载函数使用...,写法和15.6指明重载的基函数一样,效果与定义一个空的构造函数然后列表调用基构造函数一致 和普通函数的using不同,构造函数的using不会改变构造函数的访问级别 当基构造函数中有默认实参时

1.7K10

【C++】和对象(下篇)

,但是不在日期初始化列表初始化它,我们观察 _t 对象的成员变量的值被初始化为什么: 通过调试窗口可以观察到,它会调它的构造函数并走它的初始化列表,并使用缺省值 0 初始化; 那么我们日期初始化列表给它初始化呢...我们也不妨试试,结果如下: 如上图,我们日期初始化列表给它初始化,它还是会走时间初始化列表,但是没有用缺省值进行初始化,而是用我们给定的值进行初始化。...成员变量声明次序就是初始化列表初始化顺序,与其初始化列表的先后次序无关。 例如以下的日期,我们观察 _a1 和 _a2 的结果会是什么呢?...;而 B bb2 = { 2, 2 }; 和 const B& ref2 = { 3,3 }; 则进行了多参数的隐式类型转换,我们执行程序观察结果: 如上图,三个实例化都是只是调用了构造函数,说明编译器进行了优化...友元函数 我们在运算符重载,还有两个运算符没有重载:流插入和流提取。

9210

【C++初阶】与对象:6大默认成员函数------拷贝构造和赋值运算符重载

如果你的拷贝构造函数的形参不是引用,那么传参的过程,就会发生实参的拷贝,就又会去调用拷贝构造函数,如此往复,就形成了无穷递归,当然,编译器也不会让你传值的,它会直接报错: 3.... ,这就会崩溃,所以当有动态申请的资源时,要自己写拷贝构造函数; C.使用场景 1.使用已存在对象初始化新对象; class Date { public: Date(int year = 23, int...运算符重载 C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数,也具有返回值类型,函数名字以及参数列表,返回值类型与参数列表与普通的函数类似; 函数名字为:关键字operator...,那么会自动生成的赋值运算符重载,这和拷贝构造函数类似: 1.对内置类型完成浅拷贝; 2.自定义类型会去调用它的赋值运算符重载函数 下面是日期的赋值运算符重载: Date& operator...四.区分拷贝构造和赋值运算符重载 1.当我们用一个已经存在对象去初始化另一个对象时,即使写的是 “ = ” ,此时也调用它的拷贝构造函数; 2.已经存在的两个对象之间赋值拷贝,此时是赋值运算符重载

12010

C++:12---运算符重载

一、概念 已有的运算符重新进行定义,赋予另一种功能,以适应不同的数据类型 重载运算符是具有特殊名字的函数,该函数也有返回值、参数列表、函数体 二、运算符重载的3种实现方式 成员函数:私有、公有、...保护都可以 友元函数:同上 全局函数:只能访问公有的 三、运算符重载的规则 C++98,C++0x,C++11“哪些运算符重载能够重载”有一致的规定。...拷贝构造函数是用另一个对象来初始化一块内存区域,这块内存就是新对象的内存区 赋值函数是对于一个已经被初始化的对象来进行operator=操作。...=运算符重载 用途:这两个运算符用来判断两个对象数据成员的值是否相等/不相等(可以重载判断单/多个成员是否相等) 设计规则: 通常情况下,==运算符应该具有传递性,例如:如果a==b和b==c...如果类重载函数调用运算符,那么我们使用该对象时就如同调用一个函数一样 注意:()运算符与对象初始化时调用构造函数不是一个东西、因此()函数调用运算符不能再初始化使用,会与构造函数冲突 struct

58030

【C++】和对象(中篇)

编译器不会对内置类型的成员进行处理,但是 C++11 针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量声明时可以给默认值,即缺省值。...,默认生成的构造函数也不会对内置类型进行处理,但是我们声明的时候给了缺省值,执行结果如下: 最后构造函数进行总结:一般情况都需要我们自己写构造函数,决定初始化方式,例如成员变量中有指针类型的,需要我们自己决定如何初始化...最后这部分的析构函数进行总结,如果类没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如日期;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack。...作用是使对象之间可以使用某种运算符,这种运算符需要我们重载。...(2)赋值运算符重载也是的默认成员函数,我们不显式写,编译器也会默认生成一个,和拷贝构造一样,编译器默认生成的赋值运算符重载对内置类型进行值拷贝(浅拷贝),自定义类型调用它自己的赋值运算符重载

10210

C++ 的不同构造与三种引用

} 运算符重载 cpp比较强大的是可以重载与别的对象进行运算时,运算符的解释,将其解释为方法调用。...,使得里面的重载运算符函数。...,被转为 Yyt(a) 拷贝构造函数默认浅拷贝了一个对象cpyY 拷贝构造函数的定义如下,类似构造函数,而形参是一个同类对象的const左值引用,没有重写时,默认会有一个自动生成的拷贝构造函数所有对象成员进行浅拷贝...("",off)关闭了代码优化仍是这个结果,不知道是不是c++11的标准是这样 移动构造函数 除了拷贝构造c++11新增了移动构造函数,用来右值进行接管构造,而不用拷贝(比如像容器的扩容操作),示例...除了运算符进行函数重载,cpp还支持强制类型转换进行重载,如 class Yyt{ private: int b = 3; public:

2.2K10

【C++初阶】—— 和对象 (下)

运算符重载 运算符重载 一个自定义变量里,如果我们想实现它的加减乘除,是无法直接使用的,因此C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数 关键字operator 后面接需要重载运算符符号..._day; } 注意: 重载操作符必须有一个自定义类型参数 运算符重载定义外时不能访问的私有成员,因此重载成成员函数 作为成员函数重载时,成员函数的第一个参数为隐藏的this 赋值运算符重载...使用初始化列表时注意: 每个成员变量初始化列表只能出现一次(初始化只能初始化一次) 包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时...成员变量声明次序就是初始化列表初始化顺序,与其初始化列表的先后次序无关 3....,最后用无名对象给a1进行赋值 // 正常情景是能赋值的,但是explicit修饰构造函数后,会禁止构造函数的隐式转换 return 0; } 关键字explicit修饰构造函数,将会禁止构造函数的隐式转换

4910

【C++初阶】和对象修炼

文章目录 一.构造函数 1.构造函数的简单认识 2.内置类型和自定义类型的处理方式 3.日期和资源清理 二.析构函数 三.拷贝构造 四.赋值运算符重载 继上篇和对象的一些细碎知识点,这节我们要给大家讲一讲六大默认成员函数的最常用的四大默认成员函数...一.构造函数 首先给大家聊聊为什么C++要设计出构造函数构造函数完成的是对象的初始化Init(),因为实际代码编写过程,我们往往会忘记写对象的初始化函数Init(),甚至还会出现写了忘记调用的情形...PS:构造函数完成的是对象的初始化,而不是对象的创建,对象的创建是的实例化这个行为完成的,只不过构造函数的实例化,创建对象的过程同步完成的对象的初始化。...另外,由于函数重载,我们还可以写出全缺省构造函数和无参的构造函数,这三个都是默认构造函数,其中,我还顺便测试了一下,的实例化的三种方式,得出了能调用两个默认构造函数是哪几个实例化的结果。...这里如果有一个全局的和一个里的成员函数都是判断对象是否相等的运算符重载函数,那么编译器的查找策略是先在里面找,然后再去全局找,也就是里优先,其实这也是告诉我们C++推荐将运算符重载函数定义成成员函数

51050

【C++入门篇】保姆级教程篇【下】

其实我们上面的运算符重载还是有些问题,运算符重载函数传参使用的是的类型,所以调用运算符重载函数的时候,会先调用拷贝构造。...这里的使用if是为了防止自己自己的拷贝。 可能你会问赋值运算符重载有什么用?我们直接用拷贝构造函数不就行了,其实我们很多时候调用的并不是拷贝构造,而是运算符重载。...可以看到main函数Test的初始化是不成功的,如果不使用初始化列表,仅仅用构造函数进行赋值操作。...那么Date内想要对_t这个属于Time的成员函数进行初始化就必须要调用Time(没构造函数,所以调用拷贝构造的拷贝构造,然后再调用赋值运算符自定义成员变量赋值。...既然我们不能使用普通成员变量,那我们不妨使用全局变量count来创建对象进行计数,创建对象无非是调用构造函数与拷贝构造,我们只需要在构造和拷贝构造函数内将count+1就行了。

11510
领券