C++ 之 第十课 引用篇

  引用的介绍

什么是引用?引用就是别名,别名就是创建一个对象的另一个名称。创建引用的方法用&符号。在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通常我们使用它是把类对象传递给一个函数。 引用对象采用类型名加上&符号和名称的方式进行定义。例如:(int &test;),这里我们就定义了一个int类型的名为test 的引用,但是int &test;这样的方式是不能够被编译成功的,因为引用的定义必须同时给应用进行赋值操作,这里的赋值并不是说把变量的值传递给引用,而是把引用指向变量,写成这样就对了:(int &test=变量名;)。

示例一:

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 10;
    int &b = a;
    b = b + 2;
    cout<<&a<<"|"<<&b<<"|"<<a<<"|"<<b;
    getchar();

    return 0;
}

输出结果为:

从上面结果可以得知,a和b的地址是一样的,结果都为12.

  那引用作为函数的形参又是怎样的呢?

示例二

#include<iostream>
using namespace std;
//---------------------------------------------------------------------------
void swap(int &a,int &b);
int _tmain(int argc, _TCHAR* argv[])
{
    int x, y;
    x = 5;
    y = 10;
    cout<<"main函数中x="<<x<<"y="<<y<<endl;
    swap(x,y);
    cout<<"调用函数swap中x="<<x<<"y="<<y;
    getchar();
    return 0;
}
void swap(int &a,int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;

}

  从上结果分析得知,引用和指针的功能是一样的。

  常引用

用const声明的引用就是常引用。常引用所引用的对象不能被更改。我们经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改。常引用的声明形式为:const 类型说明符 &引用名。常引用作为函数形参的例子:

#include<iostream>
using namespace std;
void show(const double& r);
int main()
{
   double d(9.5);
   show(d);
   return 0;
}
void show(const double& r) //常引用作形参,在函数中不能更新r所引用的对象。
{
      cout<<r<<endl;
}

常对象

所谓常对象,是指数据成员在它的生存期内不会被改变。定义常对象时必须对其进行初始化,并且不能改变其数据成员的值。常对象的声明形式为:类名 const 对象名 或者 const 类名 对象名。常对象的例子如下:

class A
 {
 public:
 A(int i,int j) {x=i; y=j;}
                     ...
 private:
 int x,y;
};
 A const a(6,8); //a是常对象,不能被更新

如果程序中出现对常对象的数据成员修改的语句,编译器会报错。一般修改对象的数据成员有两种途径,一种是通过对象名访问公有数据成员并修改其值,而常对象的数据成员是不能被修改的;另一种是类的成员函数修改数据成员的值,而常对象不能调用普通的成员函数。可是这样的话,常对象就只剩数据,没有对外的接口了,这就需要为常对象专门定义的常成员函数了。

类的常成员函数

类中用const声明的成员函数就是常成员函数。常成员函数的声明形式为:类型说明符 函数名(参数表) const;。

要提醒大家注意几点:a.常成员函数在声明和实现时都要带const关键字;b.常成员函数不能修改对象的数据成员,也不能访问类中没有用const声明的非常成员函数;c.常对象只能调用它的常成员函数,不能调用其他的普通成员函数;d.const关键字可以被用于参与对重载函数的区分,比如,如果有两个这样声明的函数:void fun(); void fun() const;,则它们是重载函数。

#include<iostream>
        using namespace std;
        class R
        { 
        public:
                   
R(int r1, int r2)    { R1=r1; R2=r2; }
                   
void print();
                  
 void print() const;
        private:
                  
 int R1,R2;
        };
        void R::print()
        { 
                  
cout<<R1<<":"<<R2<<endl;
        }
        void R::print() const
        { 
                 
cout<<R1<<";"<<R2<<endl;
        }
        int main()
        { 
                
R a(5,4);
                
a.print(); //调用void
print()
                
const R b(20,52);  
                
b.print(); //调用void
print() const
                
return 0;
        }

上面的R类中声明了两个同名函数print,第二个是常成员函数。在main函数中定义了两个对象a和b,b是常对象,通过a调用的是没有用const声明的函数,而通过b调用的是用const声明的常成员函数。

类的常数据成员

类的数据成员也可以是常量和常引用,用const声明的数据成员就是常数据成员。在任何函数中都不能对常数据成员赋值构造函数对常数据成员初始化,只能通过初始化列表

#include<iostream>
       using namespace std;
       class A
        {
       public:
                       A(int
i);
                      
void print();
                     
 const int& r;
       private:
                      
const int a;
                      
static const int b;  //静态常数据成员
       };
      const int A::b=20; 
       A::A(int i):a(i),r(a) {}
       void A::print()
       {    
                   
 cout<<a<<":"<<b<<":"<<r<<endl; 
       }
       int main()
       {
                  
//建立对象a1和a2,并以50和10作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的常数据成员赋初值
                  
A a1(50),a2(10);  
                  
a1.print();
                  
a2.print();
                  
return 0;
       }

此程序的运行结果是:

50:20:50
       10:20:10

时间: 2024-10-13 20:54:37

C++ 之 第十课 引用篇的相关文章

【二毛SEO教程】第十课:SEO操作-内容建设

前几课小结: 1. 关键词:三大标签(首页.内容页) 2. 标签:alt/nofollow 3. 404.地图.robots.txt(页面) 301 1-3个月 4. URL的唯一性 小提示:什么时候需要做301? A B C 三个页面同时指向一个URL,此刻做301避免权重分散,1-3月见效. 第十课正文: 如何做好网站内容建设?图文转换软件 1. 什么样网站内容能帮助网站提升排名?原创.相关性.对用户有作用(锚文本)压瓦机 价格.产品说明.售后情况 彩钢设备,双层压瓦机 机械产品知识 设计机

十天学Linux内核之第十天---总结篇(kconfig和Makefile &amp; 讲不出再见)

原文:十天学Linux内核之第十天---总结篇(kconfig和Makefile & 讲不出再见) 非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的话少,没办法煽情了,,,,,,,冬天的风,吹得伤怀,倒叙往事,褪成空白~学校的人越来越少了,就像那年我们小年之后再回家的场景一样,到处荒芜,然而我们的激情却不褪去,依然狂躁在实验室凌晨两点半的星空里,也许今天又会是这样的一年,不一样的是身边的人变成学弟学妹了,而我们几个大三老家伙依然在,为自己喜欢的事情,为

python学习第十课 多路复用、ThreadingTCPServer、线程与进程

python 第十课 多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 select    poll          epoll 网络操作.文件操作.终端操作等均属于IO操作,对于windows只支持Socket操作,其他系统支持其他IO操作,但是无法检测.如普通文件操作自动上次读取是否已经变化.所以主要用来网络操作 windows 和 mac的python 只提供select,linux上的python

JMeter学习-011-JMeter 后置处理器实例之 - 正则表达式提取器(三)多参数获取进阶引用篇

前两篇文章分表讲述了 后置处理器 - 正则表达式提取器概述及简单实例.多参数获取,相应博文敬请参阅 简单实例.多参数获取. 此文主要讲述如何引用正则表达式提取器获取的数据信息.其实,正则表达式提取器获取的数据,均可看做一个变量(单个数据,此处指所需获取的测试相关数据)或数组(多个数据),通过引用变量或者数组的数据,达到应用其数据的目的.下面针对此两种方式进行介绍. 第一种:单数据变量 但数据变量的应用比较简单,同我们日常 shell 脚本引用变量相同,引用样式:引用名称.例如要引用下图中的变量,

网络十年,人生十年 - 工作篇

大家好,我是Quincy,计算机网络技术热爱着以及从业者. 作为Senior Network Engineer目前就职于新西兰某排名前三的移动宽带运营商,负责固网的MPLS.BGP 网络维护优化以及内部大型项目集成工作.持有网络认证:JNCIE-SP,CCIE Routing&Switching, CCIE Security以及其他Professional Level的认证. 话说51CTO账户都注册快十年了,同时也是我接触网络技术的十年,自认为稍有点沉淀可以给大家分享自认为有趣和有意思的事儿了

NeHe OpenGL教程 第十课:3D世界

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第十课:3D世界 加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelgeuse)所写的

【C++探索之旅】第一部分第十课:文件读写,海阔凭鱼跃

内容简介 1.第一部分第十课:文件读写,海阔凭鱼跃 2.第一部分第十一课预告:小练习,猜单词 文件读写,海阔凭鱼跃 上一课<[C++探索之旅]第一部分第九课:数组威武,动静合一>中,我们学习了动态数组和静态数组,也看到其实字符串很类似字符数组(到了之后的第二部分,学习面向对象,我们会知道其实string是一个类). 到目前为止,我们写的程序还比较简单,当然了,因为我们刚开始学习C++嘛.但只要加以训练,我们就慢慢地能够写一些真正的应用了.我们也开始逐渐了解C++的基础知识了,不过缺了很重要的一

Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter

Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter 原文链接:http://www.xuanhun521.com/Blog/7fc11b7a-b6cb-401d-8641-5202c9b7864a 文/玄魂 目录 Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter........................ 1 Meterpreter..................................

【C语言探索之旅】 第一部分第十课:练习题+习作

内容简介 1.课程大纲 2.第一部分第十课: 练习题+习作 3.第二部分第一课预告: 模块化编程 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件