关于类中c++引用的混淆
confusion about c++ reference in class
以下代码是正确的
string s1="abc";
string s2="bcd";
string &rs1=s1;
string &rs2=s2;
rs1=rs2;
cout<<rs1<<"----"<<rs2<<endl;
以下代码将编译错误:
class A
{
public:
A(string& a):ma(a) { }
string& ma;
};
string s1="abc";
string s2="bcd";
A oa(s1);
A ob(s2);
oa=ob;
cout<<oa.ma<<"----"<<ob.ma<<endl;
以上都是string&
类型赋值,为什么把它们放到类中会导致编译错误?(gcc版本4.7.1)
错误信息为
non-static reference member 'std::string& A::ma', can't use default assignment operator
您正在设置对本地临时变量的成员引用。构造函数中的参数是一个temp)。这导致了"悬空引用",这是不好的。
将参数更改为引用,或将成员更改为非引用。出于您的目的,您可能想要:
class A
{
public:
A(string& a):ma(a) { }
A& operator =(const A& other)
{
ma = other.ma;
return *this;
}
string& ma;
};
但你应该知道,你的类的默认复制构造函数可能不会做你认为会做的事情。
更新
当类具有引用成员时,处理为什么删除默认副本分配运算符的标准的特定区域:
C++11§12.8,p23
如果X具有以下情况,则类X的默认复制/移动分配运算符定义为已删除:-具有非平凡对应赋值运算符的变体成员,X是类并集,或
- const非类类型的非静态数据成员(或其数组),或
- 引用类型的非静态数据成员,或
- 类类型为M的非静态数据成员(或其数组),由于应用于M的相应赋值运算符的重载解析(13.3)导致模糊性或从默认赋值运算符中删除或无法访问的函数,因此无法复制/移动,或
- 无法复制/移动的直接或虚拟基类B,因为应用于B的相应赋值运算符的重载解析(13.3)导致模糊性或从默认赋值运算符中删除或无法访问的函数,或者
- 对于移动赋值运算符,非静态数据成员或类型不具有移动赋值运算符且不可复制的直接基类,或任何直接或间接虚拟基类
相关文章:
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- C++ DLL 引用C++.exe中的函数和类
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- CLion - 无法解决类中对构造函数的未定义引用
- 对纯抽象类中方法的未定义引用
- 在 C++ 中通过引用传递类成员时,Const 不起作用
- 运算符重载C++类中的引用返回
- 将成员函数的返回类型引用到C++中的自定义类
- 为什么转发声明的好友类不能在类中引用?
- C++通过引用传递类中的函数
- 如何引用其他类中的函数以向量增加价值
- 由于具有循环引用的类中的unique_ptr或向量而导致核心转储
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- 尝试引用子类中的抽象对象时收到编译错误
- 类似于类中的 std::map 或 std::vector 的构造函数
- C++引用基类中的子类指针属性
- 如果使用引用传递对象,则会增加引用计数类中的引用计数
- 您可以使用没有 :: 的命名空间引用其他类中的函数吗?
- 引用派生类中的基类成员
- 引用模板类中声明的结构体