直接传递对象名

用对象名做函数参数时,在函数调用时将建立一个新的对象,它是形参对象的拷贝。

================下面给出一个直接传递对象名的例子程序1.1==================

#include<iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);//构造函数
void Print();//输出信息函数
void reset(Time t);//重置函数
private:
int year;
int month;
int day;
};
Time::Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void Time::Print()
{
cout<<year<<"/"<<month<<"/"<<day<<endl;
}
void Time::reset(Time t)
{
t.year=0;
t.month=0;
t.day=0;
}
int main()
{
Time t1(12,12,12);//定义一个对象并初始化
t1.Print();//输出t1的数据成员
t1.reset(t1);//重置t1中的数据成员
t1.Print();//输出t1中的数据成员
return 0;
}

运行结果:

从运行结果来看,reset函数并没有起到作用。

实参把值传递给形参,二者分别占不同的存储空间。无论形参是否修改都不会到实参的值。这种形式的虚实结合,要产生实参的拷贝,当对象的规模比较大的时候,则时间开销和空间开销都可能很大。

因此,这种方法虽然可行,但是并不提倡这种用法~

形参为对象的引用

如果形参为对象的引用名,实参为对象名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间(常称为建立实参的一个拷贝),而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量。
对于程序1.1而言,我们只需要将reset函数的形参声明为对象的引用即可。
#include<iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);//构造函数
void Print();//输出信息函数
void reset(Time &t);//重置函数 ============对这一行代码进行了修改======================
private:
int year;
int month;
int day;
};
Time::Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void Time::Print()
{
cout<<year<<"/"<<month<<"/"<<day<<endl;
}
void Time::reset(Time &t)//==============对这一行代码进行了修改=================
{
t.year=0;
t.month=0;
t.day=0;
}
int main()
{
Time t1(12,12,12);
t1.Print();
t1.reset(t1);
t1.Print();
return 0;
}

运行结果:




形参为对象的常引用

如果我们在声明函数的参数为对象引用的时候,还可以将它声明为const(常引用)
void reset(const Time &t);

则在函数中只能使用对象t中的数据成员和成员函数,而不能修改其中的成员函数,也就是不能修改其对应的实参中的数据成员的值。

#include<iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);//构造函数
void Print();//输出信息函数
void reset(const Time &t);//重置函数
private:
int year;
int month;
int day;
};
Time::Time(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void Time::Print()
{
cout<<year<<"/"<<month<<"/"<<day<<endl;
}
void Time::reset(const Time &t)
{ //既然声明了t是对象的常引用,就不可以修改其数据成员的值,因此,下面的三行代码是错误的。。
t.year=0;
t.month=0;
t.day=0;
}
int main()
{
Time t1(12,12,12);
t1.Print();
t1.reset(t1);
t1.Print();
return 0;
}

该程序会报错,因为在函数reset中,企图修改对象t中的数据成员的值




C++中对象的常引用的更多相关文章

  1. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  2. C++ const常量对象、常量成员函数和常引用

    01 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字 class CTest { public: void SetValue() {} private: int ...

  3. Java中对象和引用的理解

    偶然想起Java中对象和引用的基本概念,为了加深下对此的理解和认识,特地整理一下相关的知识点,通过具体实例从两者的概念和区别两方面去更形象的认识理解,再去记忆. 一.对象和引用的概念: 在Java中万 ...

  4. C++中的常对象和常对象成员

    常对象 常对象必须在定义对象时就指定对象为常对象. 常对象中的数据成员为常变量且必须要有初始值,如 Time const t1(12,34,36); //定义t1为常对象 这样的话,在所有的场合中,对 ...

  5. 详解Java中对象的软、弱和虚引用的区别

    对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ...

  6. c++中返回对象与返回引用的区别

    这几天在做用C++做课程设计,对其返回对象的实现感到迷惑. 通过对汇编代码的分析,可以清楚的看到,直接返回引用和返回对象的区别到底是什么. 分析的程序如下 #include<cstdio> ...

  7. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  8. JavaScript中的this所引用的对象和如何改变这个引用

    this是函数内部的一个特殊对象,它引用的是函数执行环境对象.也就是运行是基于函数的执行环境绑定. 1.在网页全局作用域中调用函数时,this引用window var color='black'; f ...

  9. Python中对象的引用与复制

    在python进行像b = a这样的赋值时,只会创建一个对a的新引用,使a的引用计数加1,而不会创建新的对象: >>> a = 'xyz' >>> import s ...

随机推荐

  1. 保持linux下保持ssh不断线

    用ssh链接服务端,一段时间不操作或屏幕没输出(比如复制文件)的时候,会自动断开,有两种解决办法: 1.在客户端配置 #vi  /etc/ssh/ssh_config(注意不是/etc/ssh/ssh ...

  2. 图文了解 Kafka 的副本复制机制

    让分布式系统的操作变得简单,在某种程度上是一种艺术,通常这种实现都是从大量的实践中总结得到的.Apache Kafka 的受欢迎程度在很大程度上归功于其设计和操作简单性.随着社区添加更多功能,开发者们 ...

  3. codeforces 460D:Little Victor and Set

    Description Little Victor adores the sets theory. Let us remind you that a set is a group of numbers ...

  4. linux shell 编程(一)

    脚本:命令的堆砌,按照实际需要结合命令流程控制机制实现的源程序 linux 内核只能识别 elf格式的文件(可执行的可链接的文件) 脚本的第一行写 #!/bin/bash 表示脚本解释器

  5. BZOJ 1965 [Ahoi2005]SHUFFLE 洗牌:快速幂 + 逆元

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1965 题意: 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两 ...

  6. css 盒子模型 以及 box-sizing属性

    在标准的盒子模型下,css中 width,padding以及border的关系 关于css中的width和padding以及border的关系. 在css中,width和height指的是内容区域的宽 ...

  7. mysql delete数据时报Error Code 1175

    我们在学校mysql的时候,在更新或者删除数据的时候,会遇到以下错误: Error Code: . You are using safe update mode and you tried to up ...

  8. 数据库中的id不会自动 替换,这个应该处理吗。怎么处理,那个是唯一主键

  9. vs参数配置

    配置属性-常规: 输出目录:工程的输出目录,主要包括.exe..dll..lib文件,是工程最后想要的文件.vs2015位于解决方案的\x64\Debug下,vs2010,vs2005位于解决方案的D ...

  10. codeforces 651A A. Joysticks (模拟)

    A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...