关于重载赋值运算符符"="重载的问题

页面导航:
→ 正文内容 构造函数、赋值运算符重载
php中拷贝构造函数、赋值运算符重载
php中拷贝构造函数、赋值运算符重载方法, 需要的朋友可以参考下
对象的赋值与复制: 赋值:通过“ = ”运算符重载User a(10),b;b =复制:调用复制构造函数UUser a(b);或者User a =//相当于User a(b);与赋值的区别,赋值是对一个已经存在的对象进行赋值(已经实现定义了被赋值的对象),而复制是从无到有建立一个新的对象,并使它与已有的对象相同。浅复制与深复制: 若对象中有指针成员,在复制时,只会将该指针成员的地址复制给新建立的对象,因此,两个对象中的指针成员都指向了同一块内存区域,在释放时会出现重复释放的问题。 需要手动定义复制构造函数,在构造函数中将为指针变量分配新的内存,是不同对象的指针成员指向不同的内存区域。用到拷贝构造函数的三种情况: 1、需要建立一个新对象,并用另一个同类对象对其进行初始化 2、函数的参数为类的对象时,在调用函数时需要建立一个实参的拷贝,按实参复制一个形参,系统是通过调用拷贝构造函数实现的 3、函数的返回值是类的对象:函数调用结束时,需要将函数中的对象复制一个临时对象,并传给该函数的调用处。 代码如下:User getUser(){& U& }int main(){& User user = getUser();//调用getUser();}getUser()函数调用结束时,getUser中建立的对象temp的生命周期结束(即将销毁),所以不是将temp带回main,而是在执行return语句时,调用User类的拷贝构造函数,按temp拷贝一个新的、对象,然后将它赋值给user.
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910收藏,1.9k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
自己写了一个matrix的模板类, 但是在重载运算符时,出现问题了。
下面是matrix类:
// matrix.h -- A
#ifndef __MATRIX_H_
#define __MATRIX_H_
#include &iostream&
#include &ostream&
#include &fstream&
#include &string&
#include &cstring&
#include &cmath&
#include &vector&
#include &iomanip&
template &typename T&
class matrix {
vector&vector&T&&
matrix(int nRow = 2, int nCol = 2){
data.resize(nRow);
for (int i = 0; i & nR i++) {
data[i].resize(nCol);
cout && "Default Constructor" &&
matrix(matrix&T& & c):data(c.data){
cout && "Copy Constructor" &&
matrix(matrix&T& &&c):data(std::move(c.data)){
cout && "Move Constructor" && }
matrix&T& operator = (matrix&T& &c);
matrix&T& operator = (matrix&T& &&c){
data = move(c.data);
cout && "Move Assignment" &&
int row(){ return data.size();} // Get row of the matrix.
int col(){ return (row() ? data[0].size() : 0);} // Get col of the matrix.
bool is_empty(){return (row() == 0);} // check if the matrix is empty.
bool is_square(){return (!is_empty()) && (row() == col());} // check if the matrix is a square matrix.
void resize(int nrow, int ncol); // Resize matrix
void display(); // print matrix.
T &operator()(int i, int j){
if ((i & 0) || (i &= row())||(j & 0)||(j &=col())) {
cerr && "(" && i && "," && j && ") Out of Range" &&
return data[i][j];
matrix&T& operator + (matrix&T& &c);
matrix&T& operator - (matrix&T& &c);
matrix&T& operator * (matrix&T& &c);
matrix&T& operator / (matrix&T& &c);
matrix&T& operator += (matrix&T& &c);
matrix&T& operator -= (matrix&T& &c);
matrix&T& operator *= (matrix&T& &c);
matrix&T& operator /= (matrix&T& &c);
matrix&T& operator + (matrix&T& &&c);
matrix&T& operator - (matrix&T& &&c);
matrix&T& operator * (matrix&T& &&c);
matrix&T& operator / (matrix&T& &&c);
matrix&T& operator += (matrix&T& &&c);
matrix&T& operator -= (matrix&T& &&c);
matrix&T& operator *= (matrix&T& &&c);
matrix&T& operator /= (matrix&T& &&c);
template&typename U& friend std::ostream &operator&& (std::ostream &out,
matrix&T& &c);
~matrix(){
cout && "Free done" &&
template &typename T&
matrix&T& matrix&T&:: operator = (matrix&T& &c){
if (this == &c) {
if( row() != c.row()){
int nrow = row();data.resize(c.row());
if ((row() & c.row()) && (col() != c.col())) {
for (int i = 0; i & c.row(); i++) {
data[i].resize(c.col());
if ((row() & c.row()) && (col() == c.col())) {
for (int i = row(); i & c.row(); i++) {
data[i].resize(c.col());
for (int i = 0; i & c.row(); i++) {
for (int j = 0; j & c.col(); j++) {
data[i][j] = c.data[i][j];
cout && "Copy Assignment" &&
template &typename T&
void matrix&T&:: resize(int nrow, int ncol){
if ((row() == nrow) && (col() == ncol)) {
if ((row() == nrow) && (col() != ncol)) {
for (int i = 0; i & i++) {
data[i].resize(ncol);
if ((row() != nrow) && (col() == ncol)) {
data.resize(nrow);
if (row() & nrow) {
for (int i = row(); i & i++) {
data[i].resize(ncol);
if ((row() != nrow) && (col() != ncol)) {
data.resize(nrow);
for (int i = 0; i & i++) {
data[i].resize(ncol);
template &typename T&
void matrix&T&:: display(){
cout && "Row = " && row() && "\tCol = " && col() &&
cout.precision(10);
for (int i = 0; i & row(); i++) {
for (int j = 0; j & col(); j++) {
cout && setw(8) && data[i][j] && " ";
template &typename T&
matrix&T& matrix&T&:: operator + (matrix&T& &c){
if ((row() != c.row()) || (col() != c.col())) {
cerr && "Dimensions of matrices besides + don't match! Exit!!!" &&
matrix&T& temp(c.row(),c.col());
for (int i = 0; i & c.row(); i++) {
for (int j = 0; j & c.col(); j++) {
temp(i,j) = data[i][j] + c(i,j);
cout && "Copy Add" &&
template &typename T&
matrix&T& matrix&T&:: operator + (matrix&T& &&c){
if ((row() != c.row()) || (col() != c.col())) {
cerr && "Dimensions of matrices besides + don't match! Exit!!!" &&
matrix&T& temp(c.row(),c.col());
for (int i = 0; i & c.row(); i++) {
for (int j = 0; j & c.col(); j++) {
c(i,j) += data[i][j];
cout && "Move Add" &&
template &typename T&
matrix&T& matrix&T&:: operator - (matrix&T& &c){
if ((row() != c.row()) || (col() != c.col())) {
cerr && "Dimensions of matrices besides + don't match! Exit!!!" &&
matrix&T& temp(row(),col());
for (int i = 0; i & row(); i++) {
for (int j = 0; j & col(); j++) {
temp(i,j) = data[i][j] - c(i,j);
template &typename T&
matrix&T& matrix&T&:: operator - (matrix&T& &&c){
if ((row() != c.row()) || (col() != c.col())) {
cerr && "Dimensions of matrices besides + don't match! Exit!!!" &&
for (int i = 0; i & row(); i++) {
for (int j = 0; j & col(); j++) {
c(i,j) = data[i][j] - c(i,j);
template &typename T&
std::ostream &operator && (std::ostream &out,
matrix&T& &c){
if(c.is_empty()){
for (int i = 0; i & c.row(); i++) {
for (int j = 0; j & c.col(); j++) {
out && setw(8) && c(i,j) && " ";
#endif /* __MATRIX_H_ */
但在调用时,
#include &iostream&
#include "matrix.h"
int main(int argc, const char *argv[]) {
matrix&double& my(3,3);
my(2,2) = 2.12;
cout && endl &&
matrix&double& aaa(my);
cout && endl &&
matrix&double& bbb(my);
cout && endl &&
bbb = aaa + my +
cout && endl &&
matrix&double& ccc = aaa + my +
cout && endl && endl &&
matrix&double& ddd=
cout && endl &&
matrix&double& eee(aaa + bbb);
cout && endl &&
结果却是这样:
Default Constructor
Copy Constructor
Copy Constructor
Default Constructor
Default Constructor
Move Assignment
Copy Constructor
Default Constructor
Default Constructor
Copy Constructor
Copy Assignment
Copy Constructor
Default Constructor
移动构造函数并没有执行,
matrix&double& eee(aaa + bbb);
这里有两次复制构造,一次复制赋值, 本应该是移动构造的,太奇怪了。还有很多问题,大都与这有关。这是怎么回事呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我跑了一下(加了两行cout),matrix&double& eee(aaa + bbb);对应的输出是,
Default Constructor
Copy Constructor
Copy Assignment
Copy Constructor
所以,没有“两次复制构造,一次复制赋值”,而是“一次默认构造,一次矩阵加法”,也即以下代码:
template &typename T&
matrix&T& matrix&T&:: operator + (matrix&T& &c){
matrix&T& temp(c.row(),c.col());
cout && "Copy Add" &&
所以问题是,为什么矩阵加法返回了临时变量(右值引用),但eee却没有调用移动构造函数?
我认为,这里是编译器进行了更古老的一个处理——,把矩阵加法的返回值直接构造在了eee上,省去了temp。
“典型地,当一个函数返回一个对象实例,一个临时对象将被创建并通过复制构造函数把目标对象复制给这个临时对象。C++标准允许省略这些复制构造函数,即使这导致程序的不同行为,即使编译器把两个对象视作同一个具有副作用。”——引自前述返回值优化维基百科
至于为什么返回值优化会优先于移动构造函数执行,我不知道原因。我能提供的信息是,返回值优化在C++98(1998年)里已经有了,移动构造(右值引用)在C++11(2011年)里才有。
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
不友善内容
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:
扫扫下载 App
SegmentFault
一起探索更多未知C++ 关于类的小问题设x1和x2是类ITEM的对象,则语句ITEM
x=x1+x2; 将调用类ITEM的(
赋值运算符重载函数
D. 拷贝构造函数此题可能是多选的。_百度作业帮
C++ 关于类的小问题设x1和x2是类ITEM的对象,则语句ITEM
x=x1+x2; 将调用类ITEM的(
赋值运算符重载函数
D. 拷贝构造函数此题可能是多选的。
C++ 关于类的小问题设x1和x2是类ITEM的对象,则语句ITEM
x=x1+x2; 将调用类ITEM的(
赋值运算符重载函数
D. 拷贝构造函数此题可能是多选的。
看编译器的优化效果吧应该是abd编译器如果不进行优化中间会产生很多临时对象扩展成为这样:ITEM _ITEM _temp2;_temp2.ITEM(x1.operator+(x2));_temp.ITEM(_temp2);x.ITEM(_temp);_temp2.~ITEM();_temp.~ITEM(); 啊,错了,上面貌似没有调用构造函数,那就BD吧

我要回帖

更多关于 c 赋值运算符重载 的文章

 

随机推荐