cpp类和对象详细讲解(下)

张开发
2026/4/9 17:19:47 15 分钟阅读

分享文章

cpp类和对象详细讲解(下)
前言今天的很多内容也是很重要的也是需要好好学的话不多说开始今天的内容分享。正文首先我们来讲一个比较难理解的函数拷贝构造函数重点加难点拷贝构造函数是一种特殊的构造函数用于通过已有对象初始化一个新对象。当发生对象拷贝时如传值、返回对象或显式拷贝拷贝构造函数会被自动调用。我们先看下面的代码拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤使⽤传值⽅式编译器直接报错因为语法逻辑上会引发⽆穷递归调⽤。 拷⻉构造函数也可以多个参数但是第⼀个参数必须是类类型对象的引⽤后⾯的参数必须有缺省值。拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤****使⽤传值⽅式编译器直接报错因为语法逻辑上会引发⽆穷递归调⽤。 拷⻉构造函数也可以多个参数但是第⼀个参数必须是类类型对象的引⽤后⾯的参数必须有缺省值。由上面的定义我们可以知道拷贝构造是构造函数的一种特殊的形式所以他的函数名还是一样的区别是什么呢区别主要是拷贝构造的第一个参数必须是类对象的引用当然也可以多参数一般不需要。我相信很多人有疑问为什么拷贝构造的第一个参数是类对象的引用呢下面给你进行解惑。下面这个是解释所以我们的第一个参数必须是类对象的引用如果不是引用的话编译器也是会报错的。若未显式定义拷⻉构造编译器会⽣成⾃动⽣成拷⻉构造函数。⾃动⽣成的拷⻉构造对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉)对⾃定义类型成员变量会调⽤他的拷⻉构造。当然我们可以知道浅拷贝在一些情况之下是不满足我们的使用的比如说我们需要申请资源的时候以及需要深拷贝的时候。还有就是传值传参是需要开辟栈的空间的但是传引用的时候并没有这个会更加的容易。运算符重载(重点)运算符重载允许为自定义类型如类或结构体重新定义运算符的行为使其支持类似内置类型的操作方式。通过重载运算符可以使代码更直观、简洁。首先看下面的这个代码运算符重载是具有特殊名字的函数他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样它也具有其返回类型和参数列表以及函数体。运算符重载的限制1. 不能创造新运算符只能重载 C 已有运算符不能自己发明像、$ 等都不行。2. 这 5 个运算符不能重载:: 作用域解析. 成员访问.* 成员指针访问?: 三目运算符sizeof 不是运算符也不能重载3. 不能改变运算符优先级、结合性、操作数个数二元运算符不能改成一元优先级还是原来那样不会因为你重载就变4. 以下运算符只能重载为成员函数 赋值() 函数调用[] 下标- 成员访问指针原因C 语法强制防止语义混乱。5. 以下运算符建议重载为全局函数友元、 流输入输出对称运算符、-、*、/、、! 等为什么要将他们定义为全局函数呢下面给大家两个代码看一下就知道原因了。如果外面在类里面定义的话我们可以看到这个运算符与类变量之间倒反天罡了所以是不可以这样定义的正确的定义方式是这样的我们把他们定义为全局函数就可以跟正常形式是相同的所以要将他们定义为全局函数。在下面这个代码中我使用了friend与const这两个个关键字那么我们下面来讲这个两个。const的使用在 C 中const 是用于定义常量的关键字表示变量的值不可被修改。它可以应用于变量、函数参数、函数返回值以及成员函数增强代码的安全性和可读性。1. const 修饰变量变量只读不能修改。必须初始化不能后面赋值。2.const 修饰指针重点3. const 修饰成员函数表示不会修改成员变量const 对象只能调用 const 成员函数普通成员函数不能被 const 对象调用4. const 对象不能修改成员变量只能调用 const 成员函数5. 形参尽量用 const 避免拷贝保证不修改实参能接收 const 对象和普通对象6. 返回值用 const一般用于防止返回值被修改运算符重载如 、*常用 const 避免 abc 这种怪异写法7. 不能随便去掉 constconst 赋值给非 const 是错误的非要改只能用 const_cast但尽量别用友元容易理解友元Friend是C中的一种机制允许非成员函数或类访问另一个类的私有private或保护protected成员。通过友元声明可以打破封装性但需谨慎使用以避免破坏代码的模块化。外部友元函数可访问类的私有和保护成员友元函数仅仅是⼀种声明他不是类的成员函数。 我们要记住这一点。然后还有一个点是友元是单向的且不具备传递性不能A是B的友元B又是C的友元就说明A也是C的友元。单向就是说A是B的友元但是B不是A的友元。⼀个函数可以是多个类的友元函数这个是没有限制的。友元函数可以在类定义的任何地⽅声明不受类访问限定符限制。就像这样两个地方都可以声明的。讲了这么多我们还没讲他的作用下面给大家举一些作用。友元的作用1.打破类的封装让外部函数或外部类可以直接访问本类的 private / protected 成员。2.提高代码效率不用通过一堆 get/set 接口间接访问直接读写成员变量。3.方便运算符重载像 、 这种左操作数不是当前类对象的运算符必须用友元才能实现正常写法cout d。4.让多个类之间协作更方便比如两个类关系紧密、需要频繁互相访问私有数据时使用。static成员在C中static成员属于类本身而非类的实例。这意味着无论创建多少个类的对象static成员只有一份拷贝被所有对象共享。static成员可以是变量或函数。⽤static修饰的成员函数称之为静态成员函数静态成员函数没有this指针。static成员属于整个类不属于某一个对象所有对象共享同一份。static修饰的成员变量必须在类外面初始化****静态成员函数中可以访问其他的静态成员但是不能访问⾮静态的因为没有this指针。就是这个样子的他只可以访问静态的成员。与他相对的还有非静态的。⾮静态的成员函数可以访问任意的静态成员变量和静态成员函数。静态成员也是类的成员受public、protected、private 访问限定符的限制。静态成员变量不能在声明位置给缺省值初始化因为缺省值是个构造函数初始化列表的静态成员变量不属于某个对象不⾛构造函数初始化列表这个是错误的必须在类外面初始化内部类如果⼀个类定义在另⼀个类的内部这个内部类就叫做内部类。内部类是⼀个独⽴的类跟定义在全局相⽐他只是受外部类类域限制和访问限定符限制所以外部类定义的对象中不包含内部类。在一个类的内部定义的另一个类叫作内部类外部的叫外部类。内部类可以直接访问外部类私有成员。外部类不能直接访问内部类私有成员在这里的意思是Inner是不可以访问Outer的私有成员的。这里是不是跟友元很相似所以内部类天生是外部类的友元。内部类对象和外部类对象相互独立所以内部类 外部类的天然友元能访问外部类所有成员但必须通过外部对象访问不能直接写变量名。static修饰的变量则是可以被内部类直接访问的不需要间接访问的。今天的分享就到这里感谢大家的观看。

更多文章