等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)

  • 先看下面程序结果输出什么?
  •  1 #include <iostream>
     2 using namespace std;
     3
     4 class A
     5 {
     6 private:
     7     int x;
     8 public:
     9     A(){
    10         x=99;
    11         cout<<"看看这里是否会被调用"<<endl;
    12     }
    13 };
    14
    15 int main()
    16 {
    17     A a;
    18     a = 7;
    19 }

    这里面,会报错,显示没有等号匹配现象。只有无参构造函数,函数类型的对象赋值会报错

  • 接下来是有无参构造函数和有参构造函数的类
  • #include <iostream>
    using namespace std;
    
    class A
    {
    private:
        int x;
    public:
        A(){
            x=99;
            cout<<"看看这里是否会被调用"<<endl;
        }
        A(int xx)
        {
            cout<<"Call A(int xx)"<<endl;
            x = xx;
        }
    
    };
    
    int main()
    {
        A a;
        a = 7;
    }

    运行结果为:

  • 这里可以理解为当类中没有定义等号赋值运算符重载的时候,类对象的赋值会调用相对应的参数构造函数
 1 #include <iostream>
 2 using namespace std;
 3
 4 class A
 5 {
 6 private:
 7     int x;
 8 public:
 9     A(){
10         x=99;
11         cout<<"看看这里是否会被调用"<<endl;
12     }
13     A(int xx)
14     {
15         cout<<"Call A(int xx)"<<endl;
16         x = xx;
17     }
18
19     A operator=(int xx)   //重载赋值运算符运算
20     {
21         cout<<"Call A operator=(int xx)"<<endl;
22         x = xx;
23         return *this;
24     }
25
26 };
27
28 int main()
29 {
30     A a;
31     a = 7;
32 }

运行结果:

这里类中有等号操作符重载,所以会直接调用这个。

如果用友元函数重载等号操作符的时候,程序会调用参数构造函数的,这样会出错

原文地址:https://www.cnblogs.com/xiaochige/p/8645297.html

时间: 2024-07-31 03:12:23

等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)的相关文章

C语言第十回合:函数大揭秘

C语言第十回合:函数大揭秘 [学习目标] 1.       函数的定义 2.       函数的使用 3.       函数的声明 4.       形参和实参 5.       return语句 6.       函数的调用 函数:函数是包含一条或多条C语言的语句,完成程序中的部分功能的子程序.C源程序是由函数组成的. A: 函数的分类 (一)  从函数的定义角度看: (a)      库函数:由C系统提供,无需定义,如:printf,scanf,putchar- (b)      用户定义函

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化 全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this->b

友元函数实现操作符重载的应用场景-友元函数实现左移右移操作符重载

先定义一个测试类Complex,其中用成员函数的方法重载了+.-.前置++.前置--.后置++.后置--这6个运算符,当然,这6个操作符也可以用友元函数方式重载,但习惯上这些都直接用成员函数方式重载. demo #include <iostream> using namespace std; class Complex { public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } ~Complex();

为什么operator&lt;&lt;&gt;&gt;运算符重载一定要为友元函数呢?

如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身...... 而 >>  或<< 左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点........就只能申明为友元函数了... 如果一定要声明为成员函数,只能成为如下的形式: ostream & operator<<(ostream &output) { return output; } 所以在运用这个<<运算符时就变为这种形

C++(三十六) — 等号操作符重载

1.等号操作符重载,实现深拷贝 //等号运算符重载 // obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝 Name& operator=(Name &obj1) { //1.先释放旧的内存 if (this->m_p != nullptr) { delete[] m_p; m_len = 0; } //2.根据 obj1 分配内存大小 this->m_len = obj1.m_len; this->m_p = new char[m_len + 1]; //3.

C++等号操作符重载

在新学操作符重载时最令人头疼的可能就是一些堆溢出的问题了,不过呢,只要一步步的写好new 与 delete.绝对不会有类似的问题. 当时我们编译可以通过,但是运行会出错,因为对象s1与s2进行赋值时,采用浅拷贝,导致对象析构时会对同一块内存空间析构两次.也就是说等号操作符“=”,默认是进行浅拷贝,我们需要对等号操作符进行重载,使其能够进行深拷贝. 同时要重载等号操作符支持链式编程,类如 s3 = s4 = s5;  //操作符使对象连载叠加,与上一篇的return *this 与 return

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

为什么 构造函数、内联函数、静态函数和友元函数不能是虚函数

构造函数为什么不能是虚函数 C++ 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数.简单来说就是:虚函数的执行依赖于虚函数表.而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表.而在构造对象期间,虚函数表还没有被初始化,将无法进行

C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针

 目  录 1       开始学习C++.............................................................................................................. 4 1.1       C++的头文件.................................................................................................