C++的=重载问题,怎样为两个有相同成员的类赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的=重载问题,怎样为两个有相同成员的类赋值相关的知识,希望对你有一定的参考价值。

定义为友元函数无法通过编译,定义为友元类通过编译但是赋值不成功,正规的做法应该是怎样。我是新手,请指教
我有仔细检查过,我应该是这样写的,但是能够编译运行,但是将B值赋给A之后输出却还是A在赋值之前的值,问题可能出现在哪里
注:我的AB类是由一个类派生而来,具有相同的基类成员和不同的派生成员

设一个类为A,另外一个类为B
如果需要相互赋值,只要不是继承(其实即使继承,如果需要相互赋值也要类似这样),基本结构如下:
class B;//前导说明
class A

public:
A(const B&);// 类型转换用构造函数,按照实际情况可以不一定需要
A & operator =(const B&);// B类对象给A类赋值用
friend class B;// 这是友元声明,给下面的使用不一定需要,如果类B的公有函数足够也可以去掉
// 其他成员
;
//注意到这里不能实现A类中需要使用B类成员的成员函数
class B

public:
B(const A&);// 类型转换用构造函数,按情况使用
B& operator = (const A &);// 重载赋值运算符
friend class A;// 使用参照A类说明
// 其他成员
;
//注意到这里才能实现A类中需要使用B类成员的成员函数,因为这里才见到B类的成员
参考技术A 你的意思是让B的实例赋值给A的实例吗?
把重载的=运算符成为AB类的友元函数。
重载=运算符,让B的成员变量直接赋给A的成员变量不就好了吗?
然后A=B,不就可以让B值赋给A了吗?
参考技术B C++的重载是指函数有相同的名字,但是参数类型不同,在调用的时候,系统自动根据你的参数类型来决定调用哪一个函数,楼主是不是把这个搞错了 参考技术C 第一问题:String &String::operator=(String & s)//这里为什么要用‘&’而不用‘*’?
回答:如果用‘*’,即String &String::operator=(String * s)
首先该成员函数内部要修改为

if (this==s) return *this; //this是c++的关键字,表示“自己”
strcpy(str,s->str);
return *this;

其次调用该函数的地方(即所有String对象赋值的语句)要修改,例如题目中:
s2=s1改为s2=&s1
这是因为要求传入的参数必须是string对象的地址。
可见用指针很别扭,不符合一般习惯。另外一个重要的原因是如果传入的是空指针就会引起错误,如s2=0。

问题2:String &String::operator=(char *s) //这里为什么要用‘*’而不用‘&’
回答:这个赋值运算函数要求输入的是字符串的首地址,如果改为引用就成了将单个字符赋值给String对象了。

提醒注意:如果没有String &String::operator=(char *s),则String &String::operator=(String & s)还可以改写为String &String::operator=(String s),同样可以实现主函数里的所有赋值运算。否则,不可以,会引入二义性。

C++ 中 const 重载有啥用?

【中文标题】C++ 中 const 重载有啥用?【英文标题】:What is the use of const overloading in C++?C++ 中 const 重载有什么用? 【发布时间】:2010-09-20 01:15:19 【问题描述】:

在 C++ 中,函数的签名部分取决于它是否为 const。这意味着一个类可以有两个具有相同签名的成员函数,除了一个是 const 而另一个不是。如果你有一个这样的类,那么编译器将根据你调用它的对象来决定调用哪个函数:如果它是类的 const 实例,将调用函数的 const 版本;如果对象不是 const,则将调用另一个版本。

您希望在什么情况下使用此功能?

【问题讨论】:

【参考方案1】:

这只有在成员函数返回一个指针或对类的数据成员(或成员的成员,或成员的成员,...等)的引用时才有意义。通常不赞成返回非常量指针或对数据成员的引用,但有时它是合理的,或者只是非常方便(例如 [] 运算符)。在这种情况下,您需要提供一个 const 和一个非常量版本的 getter。这样,是否可以修改对象的决定取决于使用它的函数,该函数可以选择将其声明为 const 或 non-const。

【讨论】:

【参考方案2】:

它在那里,因此您可以让编译器强制您返回一个 const 对象还是一个常规对象,并且仍然保持相同的方法签名。 Const Correctness有深入的解释。

【讨论】:

【参考方案3】:

看看 std::map::operator[] 的行为。如果您尝试引用无效键,则 const 版本会引发错误,但非 const 版本会执行插入操作。插入行为比必须使用 std::map::insert 更方便(而且会进行覆盖),但不能用于 const 映射。

【讨论】:

【参考方案4】:

您可能希望使用它来决定是否返回对对象的 const 引用。 STL 的容器使用一个 const 重载的 begin() 和 end() 函数来决定是返回一个 const_iterator 还是一个普通的迭代器。

【讨论】:

【参考方案5】:
#include <iostream>
using namespace std;
class base


public:
void fun() const

    cout<<"have fun";

void fun()

    cout<<"non const";


;
int main()

    base b1;
    b1.fun(); //does not give error
    return 0;

这里编译器不会给出任何错误,因为在const 函数的情况下,编译器会将this 指针转换为const this*。第三个参数将这两个函数分开。

【讨论】:

您根本没有解释为什么成员函数需要const 限定符。

以上是关于C++的=重载问题,怎样为两个有相同成员的类赋值的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中 const 重载有啥用?

c++中拷贝构造函数和赋值运算符重载本质上一样么

C++ 多态性和重载?

const 成员函数的重载解析 C++

c++学习总结------类结构学习

[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载