C++对象的常引用

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.reset(t1);

t1.Print();

return 0;

}

输出结果:

12/12/12

12/12/12

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;

}

输出结果:

12/12/12

0/0/0

3形参为对象的常引用

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

上面的代码可以改成:

#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(const 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;

}

输出结果:

12/12/12

12/12/12

既然声明了t是对象的常引用,就不可以修改其数据成员的值

时间: 2024-10-06 11:55:20

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

对象的常指针与对象的常引用

如下所示: 定义一个类 1 class Coordinate { // 坐标类 2 public: 3 Coordinate(int x, int y); 4 ~Coordinate(void); 5 6 void SetX(int x); 7 void SetY(int y); 8 void PrintInfo(void) const; // 常成员函数 9 int GetX(void); 10 int GetY(void); 11 private: 12 int m_iX; 13 int m

const 常引用

常类型是指使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的. 这篇主要说常引用.常引用是指所引用的对象不能被更新. 在实际应用中,常引用往往用来作为函数的形参,这样的参数称为常参数.在C++语言面向对象的程序设计中,引用的使用还是比较多的,其中使用 const 修饰的常引用使用的更多.使用常参数表明该函数不会更新某个参数所指向或所引用的对象,这样,在参数传递过程中就不需要执行复制构造函数,这将会改善程序的运行效率. 示例: 1 #include <iostream.h

认识左值与常引用

代码编译运行环境:VS2012+Win32+Debug 1.左值的定义 左值是(lvalue)是C++中的一个基本概念.凡是可以出现在赋值运算符左边的表达式都是左值.与左值相对的就是右值(rvalue),凡是可以出现在赋值运算右边的表达式都是右值.左值一定可以作为右值,但反过来不一定成立. 可以给左值下一个定义:值为可寻址的非只读单元的表达式称为左值. 因此,理解左值的概念,需要注意一下几点: (1)左值一定是可以寻址的表达式,不能寻址的表达式不能作为左值.例如,表达式3+5是一个符号常量表达式

java对象的强引用,软引用,弱引用和虚引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题.一般都是new出来的. Object o=new

类之静态成员以及常对象、常成员

一.静态成员:static修饰,每个类只有一份拷贝,为所有该类的对象所共用. 1.静态数据成员: 类内声明.类外初始化.和全局变量一样,在数据段里分配内存. eg: class A{ static int co; }; int A::co=0; 2.静态成员函数: 1).静态成员函数专门用来存取类的静态成员,不可访问非静态成员,没有this指针.由static在类内声明,可以在类外定义,此时不需要static作为前缀. eg: class A{ static int co; static int

常引用

常引用:让变量引用只读属性: 分为两种:用变量初始化的常量引用,和  ,用常量初始化的常量引用 //常量引用初始化 分为两种 //1 用变量 初始化 常量引用 { int x = 20; const int& y = x; printf("y:%d \n", y); } //2 用常量 初始化 常量引用 { //int &m = 10; //引用是内存空间的别名 字面量10没有内存空间 没有方法做引用 const int &m = 10; //c++编译器会偷偷

c++常对象和常成员函数

常对象: 定义常对象的一般形式为: 类名 const 对象名[(实参表列)]; 也可以把const写在最左面: const 类名 对象名[(实参表列)]; 二者等价. 常对象的所有成员值都不能变,必须先初始化,不能调用非const成员函数 const成员函数: void get_time( ) const ; //将函数声明为const 不能改变类中的成员值们可以访问,若非要改变,可以把成员变量设置为mutable. const是函数类型的一部分,在声明函数和定义函数时都要有const关键字 不

对象的this引用

Java中的this关键字总是指向调用该方法的对象.根据this出现位置的不同,this作为对象的默认引用有两个功能: 1.构造器中引用该构造器正在初始化的对象. 2.在方法中引用调用该方法的对象. this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量.假设定义了一个Student类,这个student对象的记录成绩的方法(scores())需要调用姓名属性,那么该如何做呢?请看下面的例子: public class Student {    private int sc

【C++】const 常引用的用法

用法: const int & a; 定义了一个整型常引用变量a. 特点: 1.不能够通过常引用变量来修改其值,如: const int & a = 10; a = 12;//编译报错! 2.可以通过非常引用变量给常引用变量赋值,反之则不行. const int & a = 10; int & b = 20; a = b;//通过 b = a;//编译报错 可以通过强制类型转换来达到常引用赋值给非常引用,如下: const int & a = 10; int &am