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

关于C++中操作符重载疑问 :四个运算符=, ->, [], ()不可以重载为全局函数(友员函数

现在先说说赋值运算符“=”重载 C++规定赋值运算符“=”只能重载为类非静态成员函数,而不可以重载为类友元函数。...在此,我们可以对C++规则做出以下判断:   当类中没有定义赋值运算符重载成员函数时(注意,在未定义形参数据类型为该类类型赋值运算符重载函数时,编译器会自动生成加入),当程序执行到某一赋值 句时,...程序就会调用与赋值语句中右值类型匹配构造函数,而把这右值当作此构造函数实参。...当明白上面的规则后,现在就可以回过来,讨论为什么赋值运算符不可以重载为类友元函数了。 我们知道友元函数不是类成员函数,它只是类“朋友“,具有访问把它声明为“朋友”数据成员权限而已。...例当类A中没有定义运算符->重载成员函数,但是我们仍然可以对类A对象指针用->形式调用指针指向对象里成员

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

【C++】类和对象---友元,内部类,匿名对象详解

⚡友元函数 先看一个问题: 现在尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数。因为cout 输出流对象和隐含this指针在抢占第一个参数位置。...友元函数可以直接访问类私有成员,它是定义在类外部普通函数,不属于任何类,但需要在类内部声明,声明时需要加friend关键字。...} 说明: 友元函数可访问类私有和保护成员,但不是类成员函数 友元函数不能用const修饰 友元函数可以在类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类友元函数 友元函数调用与普通函数调用原理相同...⚡友元类 友元类所有成员函数可以是另一个类友元函数,都可以访问另一个类中非公有成员。...作为函数参数:匿名对象可以作为函数参数传递,这样可以简化代码,避免创建额外对象。 作为函数返回值:函数可以返回匿名对象,这样可以在调用函数时直接得到临时对象值。

15610

C++11(14) 简易推荐小记~

,更大一个问题是,代码没啥通用性,容器类型换一下,代码大抵得重写,而且内容都是重复~   好吧,既然问题找到了,那就来尝试改善一下:迭代器声明可以用typedef简化,不过更好自然是直接回避迭代器声明...,这里我们刚好可以借助std::for_each来达到目的,list初始化可以改用迭代器版本构造函数可以节省不少代码,至于通用性问题,模版几乎都是标准答案~   一阵改造之后,代码大概成了这样:...,add捕获子句中并不是空,而是 &add_one,什么意思呢?...简单来说,其实就是让后面我们定义函数时候可以访问被捕获变量,拿add来说,我们需要在它函数体中访问先前定义add_one,所以事先捕获一下,就这么简单一下~   到这里,add定义也清楚了,...() 和 container.end()使其不能支持没有定义begin/end成员函数容器,尤其是其不支持数组,有时候确实很不方便,而使用std::begin和std::end就不存在这个问题了:其对标准库容器支持自不必说

37820

C++基础快速入门

system("pause"); return 0; } ​ 嵌套if语句:在if语句中可以嵌套使用if语句,达到更精确条件判断 案例需求: 提示用户输入一个高考考试分数,根据分数做如下判断...函数实际主体可以单独定义。...函数声明可以多次,但是函数定义只能有一次 示例: //声明可以多次,定义只能一次 //声明 int max(int a, int b); int max(int a, int b); //定义 int...return 0; } 总结:结构体指针可以通过 -> 操作符 来访问结构体中成员 8.5 结构体嵌套结构体 作用: 结构体中成员可以是另一个结构体 例如: 每个老师辅导一个学员,一个老师结构体中...,其中在老师结构体中,有老师姓名和一个存放5名学生数组作为成员 学生成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带学生赋值 最终打印出老师数据以及老师所带学生数据。

12910

【C++】继承

然后呢,还想定义一个学生类,那此时还需要重新从0开始定义一个类? 当然也是可以。但是像这种情况,使用继承就会非常香。 为什么这种情况可以使用继承呢?...我们来看一下是不是不可见: 现在将Person成员变量都变成私有的 然后在Student里面再加一个成员函数 此时程序是可以正常运行 但是如果想访问继承下来Person...所以什么时候可以成员定义成私有啊,除了不想在类外被访问到: ,是不是如果当前类某些成员不想被子类使用和访问,也可以把它定义成私有啊。...而是: 派生类拷贝构造函数必须调用基类拷贝构造完成基类部分成员拷贝初始化。 但是Person拷贝构造要传Person类对象啊,这里传s可以?...那这时候我们其实就可以通过静态成员去解决这个问题。 Person不是有一个静态成员变量_count,只需在Person构造函数里面加一句++_count就行了 为什么这样就可以呢?

10210

C++基础入门_C语言入门基础

大家好,又见面了,是你们朋友全栈君。...; } else { cout << "未考上本科" << endl; } system("pause"); return 0; } 嵌套if语句:在if语句中可以嵌套使用if语句,达到更精确条件判断...函数实际主体可以单独定义。...0; } 总结:结构体指针可以通过 -> 操作符 来访问结构体中成员 8.5 结构体嵌套结构体 作用: 结构体中成员可以是另一个结构体 例如:每个老师辅导一个学员,一个老师结构体中,记录一个学生结构体...,其中在老师结构体中,有老师姓名和一个存放5名学生数组作为成员 学生成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带学生赋值 最终打印出老师数据以及老师所带学生数据。

5.6K20

对象引用和对象指针

引言 最近在看代码时候,又因为这个问题卡了一下,所以再详细分析下 遇到了类似这样函数 bool MyClass(sTunnl& sData, sTunnl* sBase) { // 代码 }...你可以看到,无论使用哪种方式,都可以成功访问该对象。 那*ptr->print()对,*ptr和ptr意思是一样 *ptr->print() 是不正确。...如果你想通过引用访问该对象 x 成员可以直接这样写: int a = ref.x; 为什么->运算符可以简化代码 -> 运算符是一种特殊运算符,用于通过指针访问对象成员。...它可以简化代码,因为它允许你直接通过指针访问对象成员,而无需先解引用指针。 例如,假设你有一个指向 MyClass 对象指针 ptr。...为了简化代码,你可以使用 -> 运算符: int a = ptr->x; 这样,你就可以直接通过指针访问对象成员,而无需先解引用指针。这样代码更加简洁易读。

6210

C++20新特性个人总结

requires,concept结合requires之后,对模板类型参数约束可以细致到类型成员变量、类型成员函数甚至其返回值等等。 ...2.9  ADL与不可见模板函数  ADL是C++本来就有的机制,用于自动推断调用函数位置,从而简化代码编写。而新特性扩展了ADL机制,可以用于模板函数推断。 ...这个特性在GCC、MSVC编译器中早已实现,但在其他编译器以前版本中并未实现。  理解是,在模板类内,可以忽略访问权限而访问到其他类内嵌套类。 ...循环,新增自定义范围方法  以前版本自定义类for循环,需要实现begin()和end()成员函数;新版本开始,可以不实现成员函数,而在类体外实现begin()和end(),具体看以下例子  例子...,感兴趣可以自行下载:https://download.csdn.net/download/qq811299838/12554178  内容只是展示应用层面,而不对新特性目标进行阐述,因为这样子可以少写很多字

1.9K50

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

const成员函数?...不能 const 对象调用非const成员会导致,权限放大所以会出现错误 非const对象可以调用const成员函数?...可以 非const 成员调用 const 成员函数属于权限缩小,权限是可以缩小 const成员函数可以调用其它非const成员函数?...不可以,这样会导致权限放大 非const成员函数可以调用其它const成员函数可以,非const 成员,调用const 成员是权限缩小 总结 1....这个相信很好了解,初始化列表不管我们写没写都会在初始化列表进行初始化 所以对于简单变量初始化建议使用初始化列表 一些复杂类初始化可以使用在构造函数体内进行初始化 规则二 成员变量在类中声明次序就是其在初始化列表中初始化顺序

3300

【C++修行之道】类和对象(二)类6个默认成员函数、构造函数、析构函数

2.4 一般情况,建议每个类,都可以写一个全缺省构造(好用) 三、析构函数 3.1 概念 3.2 特性 3.3 C++实现括号匹配和C语言不同 一、类6个默认成员函数 如果一个类中什么成员都没有,...空类中真的什么都没有?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会自动生成(半自动化)成员函数称为默认成员函数。...,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。...简化代码:由于 MyQueue 类在这个例子中没有特殊初始化需求,因此不需要手动编写构造函数。 如果类中没有需要特别处理初始化逻辑,那么自动生成构造函数可以简化代码,避免不必要冗余。...3.3 C++实现括号匹配和C语言不同 可以明显看出,C++对应C语言来说简化了不少,对C语言进行了一定优化。 今天就先到这了!!!

7210

探索C++对象模型

; return 0; } private: int baseData; static int sBaseData; }; 这个简单类完备包含了静态类成员函数,类成员函数,类数据成员...,静态类数据成员,虚函数.我们可以注意到base类中所有成员函数(指非静态成员函数, 下文同),静态成员函数和静态数据成员都存在于对象内存之外,也就是定义一个对象不会有额外开销来保存这些内容,这也符合我们常识....所以这个简单对象在内存中主要表现为存储非静态数据成员和虚函数.更具体而言一个对象会保存非静态数据成员和一个指向虚函数指针(vfptr,如果有虚函数的话),我们常说C++编译器会偷偷做很多事情这里便是一个例子...: int derivedData; }; 可以看到这里x派生类中新增加newVF虚函数被置于虚函数表最下方,然后如果派生类重写了虚函数就用派生类重写版本替代基类版本,其他顺序不变.同样给出验证...: int derivedData; }; 图片基本上已经把想说说完了, 这里只需要注意一下 派生类中新定义函数会置于第一个虚函数表最下面而不是两个虚函数表都放置.

51130

友元

(2.75)写成运算符形式是b*2.75 那如果是2.75*B可以?...而原来成员函数按相反顺序处理操作数,即Time*double 所以使用非成员函数可以按所需顺序获得操作数(double Time) ,接下来只有一个问题需要解决了,就是类对象数据隐藏性,然而,有一类特殊成员函数可以访问类私有成员...,也有和友元函数一样作用(最好是友元 可以成为类接口一部分) 重载<<运算符 方式1: 我们之前显示类中数据都是通过调用成员函数show来实现,现在我们通过重载<<运算符可以cout命令显示我们对象内容...Time类,达到cout可以识别Time类目的,那直接在cout类声明里面修改对Time类识别可以?...(友元友元不是友元) class MyClass { private: int value = 10; // 声明友元类 friend class FriendClass

13410

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

一、概念 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同数据类型 重载运算符是具有特殊名字函数,该函数也有返回值、参数列表、函数体 二、运算符重载3种实现方式 成员函数:私有、公有、...保护都可以 友元函数:同上 全局函数:只能访问公有的 三、运算符重载规则 C++98,C++0x,C++11对“哪些运算符重载能够重载”有一致规定。...=运算符重载 用途:这两个运算符用来判断两个类对象中数据成员值是否相等/不相等(可以在重载中判断单/多个成员是否相等) 设计规则: 通常情况下,==运算符应该具有传递性,例如:如果a==b和b==c...=运算符可以直接在return语句中应用刚才实现==运算符来简化书写 如果用成员函数实现只能有一个参数,用友元、全局函数实现是两个参数 class Cperson { private: int id;...< A[12]<<endl; return 0; } 十、->成员访问运算符重载 类成员访问运算符( -> )可以被重载,但它较为麻烦。

58030

【C++】类和对象---const成员,取地址及const取地址操作符重载,static成员

可以,const修饰了隐藏this指针,调用非const成员函数属于权限放大,不可行。 2. 非const对象可以调用const成员函数?...可以,允许这种权限缩小行为 3. const成员函数可以调用其它非const成员函数? 不可以,权限放大了 4....非const成员函数可以调用其它const成员函数?...受public、protected、private 访问限定符限制 【问题】 静态成员函数可以调用非静态成员函数?...不可以,静态成员函数没有this指针,不能访问非静态成员变量 非静态成员函数可以调用类静态成员函数可以,它们都在同一个类里面

10210

《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数

C++中利用构造函数与无名对象简化运算符重载函数   在完整描述思想之前,我们先看一下如下例子,这个例子中加运算符重载是以非成员函数方式出现: //程序作者:管宁 //...<<a.a<<endl; system("pause"); }   代码中我们使用内联函数目的是为了缩减开销,但事实上我们仍然觉得是比较麻烦,例子中情况都还是非成员函数情况,...如果运算符重载函数是作为类成员函数,那么问题就来了,重载函数第一个参数始终被隐藏,我们无发让int形参排列在隐藏参数前面,从而导致a = 10 + a;无法获取正确运算符重载函数。   ...答案是否定,我们可以利用类构造函数对参与运算整型对象进行显式类型转换,从而生成无名对象参与同类型对象加运算,这样做可以缩减代码量,提高程序可读性。   ...("pause"); }   认真观察了上面的两个例子后我们可以发现,类构造函数起了显式或者隐式转换作用,转换过程实质是产生一个类无名对象,类运算符重载函数参数就是这个无名对象引用,

44920
领券