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

【C++修行之道】类和对象(五)日期类实现、const成员、取地址及const和取地址操作符重载

效率:返回引用避免了不必要创建和返回对象拷贝。在C++中,对象复制可能是一个昂贵操作。 链式操作:通过返回引用,可以支持链式操作。...而temp是临时对象,因此只能以值方式返回,不能返回引用 1.7 输入输出流重载 // 函数声明,声明后可访问私有成员变量 friend ostream& operator<<(ostream&...const对象不能调用const成员函数。 当你将一个对象声明为const时,实际上是在承诺不会修改这个对象状态。因此,只能对这个对象调用const成员函数,因为这些函数承诺不会修改对象状态。...但这种做法是不推荐,因为它破坏了const正确性和对象常量性质,可能导致未定义行为或程序错误。通常来说,应该尽量避免这种做法。...总结来说,const成员函数内不能直接调用const成员函数保持const成员函数承诺不修改对象状态。 4. const成员函数内可以调用其它const成员函数吗?

8010

读完某C++神作,只记下了100句话

.*/ */ 是错误 表示整数、字符和布尔值算术类型合称为整形。区分类型是因为只有知道某地址值类型,才能知道需要多少位表示这个变量和如何解释这些位。...引用初始化后始终绑定到初始化对象,不能改变【引用本身不占存储单元】。const对象必须由const引用指向【避免一个能修改,一个不能修改,既对象本身和代表其引用必须同时为const】。...:将非公有成员访问权授予指定类或函数。friend在类定义内部。引入类名和函数(定义或声明)可以像预先声明一样使用。...使用算法sort等时会假定一些操作符(<)存在,此时要为类型定义重载操作符重载操作符如果是成员函数,左操作数必须是该类对象【一定是this】。 用函数或类操作某个类数据可设置其为。...派生类继承基类访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 关系不继承。

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

C++从入门到精通——类6个默认成员函数之赋值运算符重载

三、前置++和后置++重载 示例 概念 四、深挖operator 函数 模拟实现 函数 前言 类6个默认成员函数:如果一个类中什么成员都没有,简称为空类。...我们将流输出操作符 << 声明为函数,并在函数中实现输出对象内容。在主函数中,我们创建了一个名为objMyClass对象,并使用流输出操作符将其内容输出到标准输出流中。...,第一个对象永远是this指针,写成cout<<d1是错误写法,即函数重载中,参数顺序和操作数顺序是一致。...对象成员函数作为函数:在另一个成员函数中通过关键字将该类成员函数声明为函数。在函数定义中,可以直接访问该类私有成员和保护成员。...函数使用应该谨慎,因为它破坏了封装性原则,导致代码可读性和可维护性降低。在设计类时候,应该尽量避免使用友函数,而是通过成员函数来操作类私有成员和保护成员

10210

【C++初阶】类和对象终极篇

const修饰,这样的话,有两个优点: const和const对象都能调用这个函数 引用值受到const保护,在函数内部不能被修改....其实对于自定义类型运算符重载函数代码实现问题不大吗,难点在于这个函数是写成ostream类成员函数,全局函数,Date类成员函数,Date类函数一步一步优化. a.作为ostream成员函数...初始化列表:一个冒号开始,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟 一个放在括号中初始值或表达式。...先来复习一下函数: 函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数...函数调用与普通函数调用原理相同 类 :是你,就可以偷你所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员

20350

运算符重载使用它类对象作为参数

在使用时候,我们需要让类 Sender 重载 << 操作符实现将 Mail 类数据发送出去,大致用法就是 Sender << Mail 这样方式。这就涉及到了诸多问题。...此时就发挥了作用,我们需要将 Sender 类中运算符重载函数在 Mail 类中声明为函数,这样 Sender 类才能正常访问 Mail 类私有成员。...这个问题类似我们之前介绍过“类A成员函数做类B函数”。...(string addr) :_addr(addr){} // 操作符重载函数,返回 Sender 引用是为了连续 << 操作 Sender& operator<<(Mail& mail); private...}; class Mail { public: Mail(string title, string content) :_title(title), _content(content){} // 声明函数时候要加域

12630

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

声明这个operator<<函数这个,那么作为你朋友就可以访问这个私有成员变量(具体可以往后翻到那一节),这样就不需要担心私有成员不能访问问题了。...我们来看一看C++中初始化方式吧。 1)初始化列表 初始化列表:一个冒号开始,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟一个放在括号中初始值或表达式。...,但是我们又不希望这个函数出现在类内部,那样我们就只能用Get方法来返回类私有成员变量,但是我们在C++中并不经常使用Get和Set方法,而是使用另一个东西来访问类私有成员变量/函数——...我们前面在流插入与流提取就用到了函数,声明流操作符函数为类函数,则这个函数就可以访问这个私有成员变量: friend void operator<<(ostream &out, Date...const修饰 4、一个函数可以是多个类函数 5、函数调用与普通函数调用和原理相同 2)所有成员函数都可以是另一个函数

11510

【笔记】《C++Primer》—— 第7章:类

成员函数若以引用形式返回*this,则此时返回是常量引用 尽量避免在多处使用相同代码,所以尽量把类似的功能写为函数并迭代组合使用 类可以声明而暂时不定义,此时成为前向声明,得到类是不完全类型,可以作为参数...,返回类型,指针等 注意函数没有传递性,即类似自己有自己并不代表自己可以得到其他权限 声明某个类成员函数时,需要指定出这个函数是属于哪个类 对于重载函数声明时,每一种重载都要分别声明一次...前面说到即使在类内声明了也要在外部提供相应声明,这是因为我们需要函数在外部被使用/引用时,也处于正确作用域之中,不过很多编译器并不强制要求这一点而是进行了优化 7.4 类作用域 定义函数时...C11增加了“委托构造函数”,即我们可以简化之前重载多个类似的构造函数代码,我们可以在构造函数初始值列中调用委托构造函数了 ?...,不能在外部重复这个关键字 如同其余静态变量,静态成员只会被定义初始化一次 由于静态成员只在程序生命中定义一次,所以我们一方面最好将其定义与其他内联函数放在一起保证唯一次定义 静态成员类内应对常量型提供

59220

C++primer学习笔记(五)

简单说,类就是定义了一个类型和一个作用域。成员访问级别默认私有。在声明和定义处指定inline都是合法。类前向声明一般用来编写相互依赖类。类定义分号结束,之后可以跟对象列表。...:将非公有成员访问权授予指定类或函数。friend在类定义内部。引入类名和函数(定义或声明)可以像预先声明一样使用。...static成员函数没有this形参,可直接访问类static成员,不能使用static成员。 静态数据成员属于一个类,而不属于类各个对象。静态成员函数在所有对象建立之前或删除之后仍然使用。...构造函数如果是explicit必须严格按照定义使用构造函数,否则可以存在隐式转换。 引用形参将复制实参值,引用return将复制return东西。...使用算法sort等时会假定一些操作符(<)存在,此时要为类型定义重载操作符重载操作符如果是成员函数,左操作数必须是该类对象【一定是this】。 用函数或类操作某个类数据可设置其为

35810

【C++】运算符重载 ⑧ ( 左移运算符重载 | 函数 成员函数 实现运算符重载 | 类对象 使用 左移运算符 )

一、左移运算符重载 1、函数 / 成员函数 实现运算符重载 运算符重载 正规写法一般都是 使用 成员函数 形式 实现 ; 加法 + , 减法 - , 自增 ++ , 自减 - - , 一般都使用成员函数...实现 运算符重载 ; 上述 运算符重载 既可以使用 成员函数 进行重载 , 又可以使用友函数进行重载 ; 只能使用 成员函数 重载运算符 : = , [] , () , -> 等操作符 只能使用...成员函数 进行重载 ; 只能使用 函数 重载运算符 : 无法修改 左操作数 情况下 , 只能使用 全局函数 ( 声明 函数 ) 进行重载 ; 2、类对象 使用 左移运算符 平时使用 cout..., 需要重载 左移操作符 ; 3、左移运算符 << 重载 使用 全局函数 实现 左移运算符 << 重载 : 首先 , 写出函数名 , cout << s1 左移操作符重载 , 函数名规则为 " operate..." 后面跟上要重载运算符 , 函数名是 operate<< ; operate<< 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象引用 ; cout << s1 左操作数是 ostream

19810

《Effective C++》学习笔记

条款23:宁成员替换成员函数 宁可拿非成员函数来替换成员函数。...但是,非成员函数不代表就一定成为函数,能够通过public函数调用完成功能,就不该设为函数避免权力过大造成麻烦。...如果效率不够,那么给你类提供一个成员函数swap,用来对那些复制效率低成员变量(通常是指针)做交换。 然后,提供一个成员函数swap来调用这个成员函数,供别人调用置换。...解决方案是将该模板函数定义为模板类内模板函数,从而支持了参数隐式转换。...如果函数功能比较简单,可以直接inline,如果比较复杂,可以调用一个类外定义好模板函数(此时,函数已经给参数做了类型转换,因此可以调用模板函数了)。

1.1K20

运算符重载

运算符重载 函数 函数是定义在类外部,但有权访问类所有私有(private)成员和保护(protected)成员。...尽管函数原型有在类定义中出现过,但是函数并不是成员函数。...关键字friend friend 返回值类型 函数名(参数列表); friend void global_printf(const Point&that); //函数 所有成员函数都是另一个函数...Complex operator=(const Complex&other); //=运算符重载 成员函数实现 注意事项 避免自赋值 释放旧资源 分配新资源 拷贝新内容 返回自引用 //为了简便...流操作符>>,<<重载 cout是输出类对象,而cin是输入类对象,C++头文件iostream取自istream和ostream之意 流操作符>>,<<一般使用非成员函数实现,也就是函数实现

92060

CC++编码规范

对于内置类型参数应传递引用(首选)或指针。 避免使用参数不确定函数。 若不得不适用参数不确定函数,用提供方法。...函数声明(而不是实现)时定义参数缺省值 恰当选择成员函数、全局函数函数 防范、杜绝潜在二义性 显式禁止编译器自动生成不需要函数 < 14...任何声明若被多个源文件引用则应在一个头文件中 头文件中尽量避免包含其他头文件 2.7性能 使用性能追踪分析工具 不要用移位代替乘除运算 如无必要,不要用int... 区分作为成员函数和作为操作符 尽量使用前缀操作符 确保相关一组操作符行为统一 绝不要自定义operator&&()、operator||... 尽量避免重载在模板类型上 2.15 少用友 减少拥有特权个数 2.16模板 使用模板如果有限制条件一定要在注释和文档中描述清楚

1.9K20

【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

分为:函数类 通俗而言:函数声明表达了函数能够访问这个权限,相当于客人(函数拥有主人家钥匙(声明),可以随便进出主人家里,偷吃主人家里饼干(访问私有域成员...关键字 说明: 函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数...所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员。...@ 重载操作符必须有一个类类型参数 用于内置类型运算符,其含义不能改变:例如+ 作为类成员函数重载时,其形参看起来比操作数少一个(因为成员函数一个参数为隐藏this) .* / :: /sizeof...一个模板函数可以和一个同名函数模板同时存在,而且该函数模板还可以被实例化为这个模板函数 对于模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用模板函数而不会从该模 板产生出一个实例

14310

C++之类和对象

引入 函数 类 内部类 匿名对象 拷贝对象时编译器一些优化 再次理解类和对象 面向对象和面向过程初步认识 在学习C语言时候,遇到一个问题时候我们更关注于是解决这个问题需要哪些步骤;...,那就因小失大了,所以最好办法就是讲运算符重载写在类里面,否则是无法访问到成员变量: ---- 那么为什么在写运算符重载时候只传了一个参数,而且是需要加天数而不对象呢?...为了解决这个问题呢C++就提出了一个东西,又分为函数类; 函数 **函数可以直接访问类私有成员,它是定义在类外部普通函数,不属于任何类,但需要在类内部声明,声明时需要加...总结 函数可访问类私有和保护成员,但不是类成员函数函数不能用 const 修饰; 函数可以在类定义任何地方声明,不受类访问限定符限制; 一个函数可以是多个类函数函数调用与普通函数调用原理相同...; 所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员 (不受访问限定符限制)。

1.1K00

【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 | |匿名对象|拷贝时一些编译器优化

,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟一个放在括号中初始值或表达式。...但是会增加耦合度,破坏了封装,所以不宜多用。 分为:函数类 3.1 函数 问题:现在尝试去重载operator>同理。...,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数 函数调用与普通函数调用原理相同 3.2 所有成员函数都可以是另一个函数...简洁性:返回匿名对象使代码更简洁,不需要手动管理临时对象生命周期。 避免副作用:匿名对象生命周期受限于其所在表达式范围,减少了意外修改或使用未定义对象风险。

5210

C++初阶 类和对象(下)

拷贝构造函数只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用已存在类类型对象创建新对象时由编译器自动调用。 1.2 为什么得是引用?...为什么这个形参得是被类对象引用呢,直接传递这个要拷贝目标不可以吗,不是一样操作吗。...,至于为什么要加const是因为我们传递过去变量是被拷贝,是不会被修改 加个const是为了避免一些低级错误发生,比方说修改到了被拷贝对象,同时增加了代码可读性。...(参数) 运算符重载既可以写在类里面,也可以写在类外面 而写在类外面我们往往会用到一个操作叫这个操作大致意思就是令你这个在类外面的东西成为这个朋友,因此你这个类外面的东西就可以访问到类中....作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数一个参数为隐 藏this 5. .* :: sizeof ?

14310

【C++类和对象】const成员函数及流插入提取

2.取地址以及const取地址操作符重载 这两个默认成员函数一般不用重新定义,编译器默认会生成; 在C++中,使用&操作符可以取得一个对象地址。...它重载函数应该以 istream&类型作为返回值,并以一个 istream&类型参数(通常是输入流对象)和要提取到数据引用作为参数。...在C++中流插入提取操作符重载是不可以重载成员函数,因为它们参数顺序不可以改变,例如: 这是因为流插入第一个运算符是cout,而如果将其重载成员函数一个参数就是类和对象中隐含this指针...,所以参数顺序不匹配,我们只能将其重载成全局函数;与此同时流插入运算符和流提取运算符通常都是以函数形式定义在类声明内部,这允许它们访问类私有成员。...const,因为其内部不涉及修改生成;取地址与const取地址这两个运算符一般不需要重载,使用编译器生成默认取地址重载即可,只有特殊情况,才需要重载;此外流插入运算符和流提取运算符通常都是以函数形式定义在类声明内部

10010

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

_day; } 注意: 重载操作符必须有一个自定义类型参数 运算符重载定义在类外时不能访问类中私有成员,因此重载成员函数 作为类成员函数重载时,成员函数一个参数为隐藏this 赋值运算符重载...因为初始化只能初始化一次,而构造函数体内可以多次赋值 初始化列表概念 初始化列表: 一个冒号开始,接着是一个逗号分隔数据成员列表,每个"成员变量"后面跟一个放在括号中初始值或表达式 Date(...分为: 函数 函数 如果尝试去重载operator<<,我们发现没办法将operator<<重载成员函数,因为函数参数位置不一样,cout输出流对象和隐含this指针在抢占第一个参数位置...: 函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数 函数调用与普通函数调用原理相同...所有成员函数都可以是另一个函数,都可以访问另一个类中非公有成员 特征: 关系是单向,不具有交换性 关系不能传递 如果C是B, B是A

4810

C++关键知识点梳理

基本类型基本类型大小随编译器决定,下面32位为例类型大小 (字节)bool未定义char1short2int4long4long long8float4double8变量变量初始化,在C++中,使用未初始化变量是一种错误编程行为...类设计工具拷贝、赋值、销毁拷贝构造函数:将一个对象作为引用实参、将一个引用对象直接作为函数返回值、用花括号列表初始化一个数组或者一个成员时均使用了拷贝构造函数。...class Foo { public: Foo(); Foo(Foo& other); // 拷贝构造函数必须使用引用避免循环拷贝};赋值构造函数重载运算符=...,构造函数初始化类static数据成员,析构函数销毁static数据成员,而且数据成员销毁顺序和在构造函数中初始化顺序相反。...public 成员:可以被任意实体访问protected 成员:只允许被子类及本类成员函数访问private 成员:只允许被本类成员函数类或函数访问继承子类(派生类)可通过public、protected

92630

C++初阶 日期类实现(下)

最好使用引用返回,和引用传参,因为这个参数对应cout是个全局变量不会随着你函数作用域结束而销毁。...d1<<cout: 1.2并修改 1.2.1简单介绍下 如果以后得d1<<cout 那未免有点抽象,还是更喜欢cout<<d1,这要如何解决呢,先揭晓答案,在类中实现解决不了这个问题,为什么呢...这时候就可以介绍到,什么是呢,就是在类中声明一下需要函数,并在前+friend,这就是,之后被函数就可以使用类里面的私人成员,例如说,一个int sum(int a, int...b)函数想要这个sum函数可以访问到我类里面的成员,那么就可以在类中friend int sum(int a,int b);不过值得注意一点是,类和类之间是单向把你看作是朋友...1.2.2修改 有了之后我们修改便只需要在类外面把我们函数写好后,再在Date类中使用友扩大我们函数权限即可 1.3>>重载 有了前面的基础,这个实现自然是手到擒来 二、条件判断操作符实现

9310
领券