c++-复制构造函数的形参,常引用

问题描述

复制构造函数的形参,常引用

C++中,复制构造函数为什么要用“常引用”作形参,而不是“引用”?谢谢啦

解决方案

复制构造函数中不能修改的内容,是p的成员变量,即p.pointer的值。也就是说,你不能使p.pointer指向别的位置。即下面这段代码会报错:

Pstu(const Pstu& p)
{
pointer = p.pointer;
p.pointer = NULL; //这句代码会报错
cout << "此时count为:" << (*pointer).count << endl;
(*pointer).count++;
cout << "Pstu1" << endl;
cout << "此时count为:" << (*pointer).count << endl;

}

const只能保护到这一层,至于你再去修改pointer所指向的变量的值,const是保护不了的。

解决方案二:

常引用表示你不会修改参数的值,这是一种约定。
例如:

T b = a;

这句话的意思是新建一个和a一样的对象b。执行完了,你自然不希望a的值有任何改变。
在函数声明时加上了const,使用的人即使没看到函数具体实现,也知道你不会修改传入对象的值,这样才能放心地把a的值传给你。

解决方案三:

#include "stdafx.h"
#include
#include
using namespace std;

class Pstu;
class student
{
public:
friend class Pstu;
student(int aid, char* pstr) :id(aid), name(pstr)
{
cout << "student构造函数被调用" << endl;
count = 0;
}
~student()
{
cout << "student is destructing..." << endl;
}
void display()
{
cout << "id:" << id << endl;
cout << "name:" << name << endl;

}
private:
unsigned int count;
int id;
char* name;
};
//////////////////////////////////////////////////////////

class Pstu
{
public:
Pstu(student* p) :pointer(p)
{
cout << "Pstu" << endl;
(*pointer).count++;
cout << "此时count为:" << (*pointer).count << endl;
}
Pstu(const Pstu& p)
{
pointer = p.pointer;
cout << "此时count为:" << (*pointer).count << endl;
(*pointer).count++;
cout << "Pstu1" << endl;
cout << "此时count为:" << (*pointer).count << endl;

}
~Pstu()
{
(*pointer).count--;
cout << "此时count为:" << (*pointer).count << endl;
if (!(*pointer).count)
{
cout << "Pstu is destructing..." << endl;
delete pointer;
}
//delete pointer;
}
unsigned int get_count()
{
return (*pointer).count;
}

//student& operator* (){ return pointer; }
//student
operator->(){ return pointer; }
private:
student* pointer;
};
/////////////////////////////////////////////////////////
int main()
{
Pstu p = (new student(1000, "张思源"));
Pstu p1 = p, p2 = p;
cout << p.get_count() << endl;
cout << p1.get_count() << endl;
cout << p2.get_count() << endl;
//p->display();
return 0;
}

既然是通过复制构造函数得到的p1,p2,为什么三个对象中的count 值都是3?是不是复制构造函数中有一句“pointer = p.pointer;”,使得三个对象
private成员变量pointer都指向了和p一样的内存地址?并且在复制构造函数中能修改count的值?这与常引用的初衷不是相矛盾了么?

时间: 2024-09-19 08:55:06

c++-复制构造函数的形参,常引用的相关文章

C++中对象的常引用、动态建立和释放相关知识讲解_C 语言

C++对象的常引用 我们知道,一个变量的引用就是变量的别名.实质上,变量名和引用名都指向同一段内存单元. 如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间(常称为建立实参的一个拷贝), 而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量. [例] 对象的常引用. #include <iostream> using namespace std; class Time { public: Time(int,int,int); int

C++中对象的常引用总结_C 语言

直接传递对象名 用对象名做函数参数时,在函数调用时将建立一个新的对象,它是形参对象的拷贝. ================下面给出一个直接传递对象名的例子程序1.1================== 复制代码 代码如下: #include<iostream>using namespace std;class Time { public:  Time(int,int,int);//构造函数   void Print();//输出信息函数   void reset(Time t);//重置函数

复制构造函数

问题描述 复制构造函数 看代码: Test.h: class A{public: A(){}; ~A(){}; A(const A& a) { data = a.data; } int data; A& operator + (const A& a);}; A& A::operator + (const A& a){ A temp; temp.data = data + a.data; return temp;} Main.cpp: #include using n

C++返回值为对象时复制构造函数不执行怎么破

先说点背景知识,调用复制构造函数的三种情况: 1.当用类一个对象去初始化另一个对象时. 2.如果函数形参是类对象. 3.如果函数返回值是类对象,函数执行完成返回调用时. 在辅导学生上机时,有同学第3点提出异议.有教材上的例题为证: #include <iostream> using namespace std; class Point //Point 类的定义 { public: Point(int xx=0, int yy=0) { x = xx; //构造函数,内联 y = yy; } P

c++ 类 复制构造函数,析构函数

问题描述 c++ 类 复制构造函数,析构函数 c++类, 复制构造函数中产生的对象在程序结束后或运行中 会不会被析构 解决方案 只要程序正常运行,正常关闭,都会执行析构函数.如果你有疑问,你可以自己试验下. 解决方案二: 贴出你完整的代码 析构函数对于每个对象的实例只调用一次. 解决方案三: 1.如果没有显示定义复制构造函数或赋值操作符,编译器通常会为我们定义. 2.复制构造函数.赋值操作符.析构函数总称复制控制.编译器自动实现这些操作,蛋类也可以定义自己的版本. 3.有一种特别常见的情况需要类

BUG现形记(二)——偷工减料的复制构造函数

[课程支撑]我的 C++程序设计课程教学材料 [摘要]设计数组类,要实现数组类中两个数组相加的运算,程序却陷入死循环.逐层排查,重载的加法正确,重载的赋值运算也看不出问题.跟踪到赋值运算的实现中发现,传递的参数中有异常,终于找出了嫌疑犯--编制的复制构造函数偷工减料. [阅读提示]现在打开你熟悉的c++,跟随作者的的思路,重走发现嫌犯的过程. 题目是建立专门的数组类处理有关数组的操作,要完成支持数组操作的类的设计,增强C++内置数组类型功能.--见:第14周-任务1-数组类的构造 有同学向我求助

对象更有用的玻璃罩——常引用

原创案例讲解--"玻璃罩const"系列的三篇文章: 1. 使用常对象--为共用数据加装一个名为const的玻璃罩 2. 常(const)+ 对象 + 指针:玻璃罩到底保护哪一个 3. 对象更有用的玻璃罩--常引用 本文讲在基于对象的程序设计中,函数中传递参数使用更广泛的技术,利用引用及常引用的话题. 先从引用的作用开始谈起. 一.引用用在参数传递中的优势:带回修改值及节省开支 先从一个经典的例子开始. 假如现在要交换两个整数,编写出的程序如下: //程序1 #include <

【C++】This指针和复制构造函数

在声明一个类的时候,是没有分配存储空间的,只有在真正定义一个对象的时候,程序才会为这个对象分配相应的存储空间. 如果定义了多个对象,这些对象都有自己的存储空间,但是这些对象都是用相同的成员方法的. 当不同的对象调用成员方法时,怎么保证就是这个对象的成员? this指针 在每个成员函数中,都包含一个特殊的指针. 这个指针的名字是固定的,就是this指针. this指针是指向类对象的指针,它的值是当前被调用的所在对象的地址! this指针是指向本类对象的指针,它作为参数传递给成员函数 this指针是

《C++面向对象高效编程(第2版)》——3.3 复制构造函数

3.3 复制构造函数 C++面向对象高效编程(第2版)③ TIntStack s2 = s1;这是一个小小的技巧.我们试图创建TIntStack类的另一个对象s2.但是,我们希望用s1初始化这个对象.换句话说,必须通过s1创建s2.当然,前提是s1已经存在.这类似于以下声明: int j; int k = j; // 创建一个k并初始化为j``` 在这种情况下,编译器知道如何用j初始化k,因为int是语言定义(内置)类型.然而,③中的TIntStack是程序员定义类型,这表明由程序员负责将s1初