一、引用

(1)、引用是给一个变量起别名
定义引用的一般格式:类型  &引用名 = 变量名;
例如:int a=1;  int  &b=a;// b是a的别名,因此a和b是同一个单元
注意:定义引用时一定要初始化,指明该引用是谁的别名
在实际应用中,引用一般用作参数传递与返回值

引用不是变量,引用仅仅只是变量的别名,引用没有自己独立的空间,引用要与它所引用的变量共享空间,对引用所做的改变实际上是对它所引用的变量的改变,引用在定义的时候要进行初始化,引用一经初始化,不能重新指向其他变量。

(2)const 引用

const引用是指向const对象的引用

const int ival = 1024;
const int& refVal = ival; //ok:both reference and object are const
int &ref2 = ival; //error:nonconst reference to a const object

(3)、按引用传递

引用传递方式是在函数定义时在形参前面加上引用运算符"&"
例如:swap(int &a,int &b);
按值传递方式容易理解,但形参值的改变不能对实参产生影响
地址传递方式通过形参的改变使相应的实参改变,但程序容易产生错误且难以阅读
引用作为参数对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include <iostream>
using namespace std;
void swap(int &x, int &y);
int main(void)
{
    int a, b;
    a = 10;
    b = 20;
    swap(a, b);
    cout << "a=" << a << "b=" << b << endl;
    return 0;
}
void swap(int &x, int &y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

注意:引用作参数时,函数的实参与形参在内存中共用存储单元,因此形参的变化会使实参同时变化。

(4)、引用作为返回值

引用的另一个作用是用于返回引用的函数
函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
注意:不能返回对局部变量的引用,具体可以参见我的这篇文章,文章里面还比较了引用与指针的关系。

(5)、引用与指针区别

引用访问一个变量是直接访问,而指针是间接访问。
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
引用一经初始化不能再引用其它变量,而指针可以。
c++建议尽可能使用引用,不得已时使用指针。

二、数组引用与指针引用

请注意:sizeof 返回的是ssize_t (32位下4字节,64位为8字节)

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
/*************************************************************************
    > File Name: test.cpp
    > Author: Simba
    > Mail: dameng34@163.com 
    > Created Time: Wed 21 May 2014 06:50:11 PM PDT
 ************************************************************************/

#include<iostream>
using namespace std;

void func1(char s[10]) // char *s 
{
    cout<<"func1"<<endl;
    cout<<sizeof(s)<<endl;
    cout<<s[1]<<endl;
    s[1] = 'B';
    cout<<s[1]<<endl;   
}

void func2(char (&ss)[100])  // 数组引用
{
    cout<<"func2"<<endl;
    cout<<sizeof(ss)<<endl;
    cout<<ss[1]<<endl;
    char * f2 = ss;
    f2[1] = 'D';
    cout<<f2[1]<<endl;
}

void func3(char * const &  sss)// 指针引用
{
    cout<<"func3"<<endl;
    cout<<sizeof(sss)<<endl;
    cout<<sss[1]<<endl;
    char * f3 = sss;
    f3[1] = 'F';
    cout<<f3[1]<<endl;
}

int main(void)
{

char s[10] = {'a', 'b'};
    char ss[100] = {'c', 'd'};
    char sss[1000] = {'e', 'f'};

cout<<"main fun"<<endl;
    cout<<sizeof(s)<<endl;

func1(s);
    func2(ss);
//  func2(sss);  error
    func3(sss);

return 0;
}

输出为:

simba@ubuntu:~/Documents/code/cpp$ g++ test.cpp -o test
simba@ubuntu:~/Documents/code/cpp$ ./test 
main fun
10
func1
4
b
B
func2
100
d
D
func3
4
f
F

如果数组为const char s[n]; 那么三个func的参数前面都得加const,当然此时就不能够在函数里面修改数组元素了。

三、内联函数

(1)、内联函数

当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。有些情况下,函数本身功能简单,代码很短,但使用频率却很高,程序频繁调用该函数所花费的时间却很多,从而使得程序执行效率降低。

为了提高效率,一个解决办法就是不使用函数,直接将函数的代码嵌入到程序中,可以使用带参数的宏定义实现,但是这种方法也有缺点,程序可读性往往没有使用函数的好,如果缺少了一些括号还可能出现歧义。
为了协调好效率和可读性之间的矛盾,C++提供了另一种方法,即定义内联函数,方法是在定义函数时用修饰词inline。inline关键字告诉编译器,这个函数的调用要尽可能快,可以当普通的函数调用实现,也可以用宏展开的办法实现。在C99也引入了inline
关键字。

(2)、内联函数和带参数的宏的区别

inline int max(int a, int b)
{
return a > b ? a : b;
}
#define MAX(a, b)  ((a) > (b) ? (a) : (b))

内联函数调用时,要求实参和形参的类型一致,另外内联函数会先对实参表达式进行求值,然后传递给形参;如果实参表达式有Side Effect,那么这些SideEffect只发生一次。例如MAX(++a, ++b),如果MAX是个真正的函数,a和b只增加一次。而宏调用时只用实参简单地替换形参;如果MAX是上面那样的宏定义,则要展开成k
= ((++a)>(++b)?(++a):(++b)),a和b 增加的次数就难说了。
内联函数是在编译的时候、在调用的地方将代码展开的,而参数宏则是在预处理时进行替换的,故生成的目标文件都比较大。

在C++中建议采用inline函数来替换带参数的宏。

四、四种类型转换

参考我的这篇文章

参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范

引用、数组引用与指针引用、内联函数inline、四种类型转换运算符的更多相关文章

  1. 【转】ios内联函数 inline

    ios内联函数 inline 缘由 由于在学习使用UIScrollVew开发的过程中,碰到下面这个属性(设置内边距): @property(nonatomic) UIEdgeInsets scroll ...

  2. (转载)内联函数inline和宏定义

    (转载)http://blog.csdn.net/chdhust/article/details/8036233 内联函数inline和宏定义   内联函数的优越性: 一:inline定义的类的内联函 ...

  3. 内联函数inline的用法

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗.为了解决这个问题,特别的引入了inline修饰符,表示为内联函数.  栈空间就是指放 ...

  4. 07 c++中的内联函数inline

    文章链接: 问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联 ...

  5. 《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)

        新手入门:关于C++中的内联函数(inline) 在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数. 可能说到这里,很 ...

  6. 从零开始学C++之从C到C++(二):引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1; int  &b=a;// b是a的别名,因此a和b是同一个单元 注 ...

  7. iOS OC内联函数 inline的详解

    inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A. ...

  8. 内联函数inline

    1:使用inline函数的时候,必须使函数体和inline说明结合一起,否则编译器将视他为普通函数处理: false: inline void Coord::setcoord(int a,int b) ...

  9. 内联函数 inline

    (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...

随机推荐

  1. ALAssetsLibrary使用

    在iOS中,我们调用摄像头和选择相册中的资源,我们可以使用:UIImagePickerController类来完成.   当然,我们也可以不使用UI的形式来访问iOS设备的相册资源. 那就是使用:AL ...

  2. Powerdesigner打开工程提示打印错误 解决方法

    在使用PowerDesigner打开工程时, 提示打印错误的问题,具体错误信息提示如下: 在您可以执行与打印机有关的任务(例如页面设置或打印一个文档)之前,您必须已经安装打印机.您想现在安装打印机么? ...

  3. 【MongoDB】windows下搭建Mongo主(Master)/从(slave)数据库同步

    在前面一系列的文章中.我们讲述了mongodb的基本操作,高级查询以及索引的使用. 该篇博客主要说明在windows系统怎样创建主从数据库同步: 须要启动两个mongoDb文档数据库,一个是主模式启动 ...

  4. sql 锁类型与锁机制 转

      SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁.   2. NOLOCK:不添加共享锁和排它锁,当这个 ...

  5. Andorid之Annotation框架初使用(二)

    Fragment: @EActivity(R.layout.fragments) public class MyFragmentActivity extends FragmentActivity { ...

  6. ASP.NET 5 Beta6发布了(翻译)

    感觉就好像我们刚刚发布了一个版本,现在我们又要发布一个新的版本.开发团队通过努力工作在Visual Studio2015的正式版上提交使用ASP.NET 5开发工具的上的更新以及库的更新.新的版本为b ...

  7. Axure Beta 7.0 汉化版下载

    Axure的最新版本下载地址如下 安装文件地址: PC版下载地址:点我下载  Mac版下载地址:点我下载 下载后下载汉化包即可进行汉化(含中文部件库) 汉化文件:点我下载 -------------- ...

  8. 织梦(Dedecms) 5.1 feedback_js.php 注入漏洞

    漏洞版本: DEDECMS 5.1 漏洞描述: 同样是在magic_quotes_gpc=off的情况下可用 此漏洞可拿到后台管理员的帐号和加密HASH,漏洞存在文件plus/feedback_js. ...

  9. [置顶] JDK工具(零)--简要介绍JDK1.6自带的42个工具

    Java的开发人员肯定都知道JDK的bin目录中有“java.exe”和“javac.exe”这两个命令行工具, 但并非所有的Java程序员都了解过JDK的bin目录之中其它命令行程序的作用. JDK ...

  10. jquery操作CSS样式全记录

    $(this).click(function(){  if($(this).hasClass(“zxx_fri_on”)){    $(this).removeClass(“zxx_fri_on”); ...