当前位置: 首页 > 知识库问答 >
问题:

c++11 - C++有关成员函数返回类的引用的一些问题?

颜乐
2023-06-08
#include<iostream>
using namespace std;

class A {
public:
    int val;
    int s;
    A(int val = 0, int s = 0 ) {
        this->val = 10;
        this->s = 12;
        cout << this << endl;  //怀疑是下面的注释处 临时创建了一个变量 所以这里输出 this值 做区别
    }
    ~A() {
    }
    A& getobj() {
        return *this;
    }
};

int main() {

    A aa;
    int m, n;
    cin >> m >> n;    //输入 2 3
    aa.getobj() = m;   //想问问 这一步具体发生了什么?
    cout << aa.s << endl; //输出12 
    cout << aa.val << endl;    //输出10 

    return 0;
}

*我在中间调试的时候发现在走到 aa.getobj()=m 这一行的时候发生了又走了一遍新的构造函数 不知道这是为什么?我怀疑是中间临时构建的一个对象 但是为什么要这么做?
还有就是 为什么int变量可以赋值给自定义的类 是类似于int 赋值给double 的情况吗?就是类型的隐式转换 是这样吗? *
求解~

共有2个答案

严阳夏
2023-06-08

是的,这里发生了隐式转换,就相当于 aa = 2

如果定义了合适的赋值构造函数,那么这里就会走辅助构造函数,比如 A &operator=(int ) { return *this; }

如果要禁止这种隐式转换,使用 explicit 关键字

姜杜吟
2023-06-08

构造函数可以用于类型转换,详见class.conv.ctor。你程序中的构造函数就可以用于把 int 转换为 class A 。

对类对象的赋值本质是一个函数调用,调用的赋值运算符。没有用户定义的话,通常会生成一个,类型是 A& operator=(const A&);。 m 作为一个 int 类型的对象,可以转换为 class A 的对象,于是用于参数调用 class A 的 opertor= ,于是就赋值了。

赋值过程了,发生了 int 类型到 class A 类型的转换,这个类型转换是通过构造函数实现的,于是构造函数被调用了。类型转换的结果是一个 class A 的临时对象。

 类似资料:
  • C++ 类 & 对象 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。 让我们看看之前定义的类 Box,现在我们要使用成员函数来访问类的成员,而不是直接访问这些类的成员: class Box { public: double length; // 长度

  • 我想在C++11中使用多线程来调用一个类成员函数在它自己的线程中。我已经能够让它与全局函数一起工作:

  • 主要内容:在类体中和类体外定义成员函数的区别类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是

  • 在这些关于C 11/14标准的幻灯片中,在幻灯片15中,作者写道,“许多经典的编码规则不再适用于C 11中”。他提出了三个示例的列表,我同意三法则和内存管理。 然而,他的第二个例子是“具有虚拟成员的虚拟析构函数”(仅此而已)。这是什么意思?我知道必须将基类析构函数声明为虚拟,以便调用正确的析构函数,如果我们有类似的东西 这里很好地解释了:什么时候使用虚拟析构函数? 但是,如果您有虚拟成员,现在在C

  • 我试图在C类中实现一个返回模板参数的constexpr成员函数。代码应该是c 11兼容的。然而,当模板化的类还包含STL容器作为数据成员时,比如STD::vector(const expr成员函数不涉及它),我会遇到编译问题。 以下代码给出了一个最小的示例: 代码使用命令正确编译 g -std=c 14 -O3 快速测试.cpp -o 测试 -Wall clang-STD = c 11-O3 qu

  • 本文向大家介绍关于C++类的成员初始化列表的相关问题,包括了关于C++类的成员初始化列表的相关问题的使用技巧和注意事项,需要的朋友参考一下 在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list): 1,初始化一个引用成员(reference member); 2,初始化一个常量对象(const member); 3,调用一个基类的构造函