参数的常量引用const int &a和引用 int &a的区别
2017-05-18 11:19
671 查看
首先介绍一下为什么我们要使用引用形式进行参数传递。
我们写一个函数 void fun(int a,int b),这样的函数调用时是不会改变参数的值的,在函数中也就是以一个局部变量的形式存在,当函数结束时,变量a,b的生命周期也就结束了。
而对于 void fun(int &a,int &b),这种形式进行参数传递,其实是一种指针的形式,如果在函数内我们改变了a,b的值,当函数结束后,原来的值也将被改变。
当参数是较大的数据结构类型时,而且我们不需要改变原变量中的值,那么我们为什么要使用void fun(vector<int> &a),而不使用void fun(vector<int> a)呢,因为void fun(vector<int> a)需要对原变量进行一次复制操作,即使两个变量名是相同的由于作用域不同,所以其实是两个变量,所以需要一次复制操作,因此当数据大小较大时是非常浪费时间的。
那么自然的就引出了这样的问题,我们使用void fun(vector<int> &a)不需要进行复制操作,但是不小心在函数中改变了参数的值不就得不偿失了。所以就有了void fun(const vector<int>
&a)这样的结构,我们都知道const关键字定义的变量是不可以被改变的,所以当我们进行常量引用时既不会进行复制操作,当误操作时又不能编译通过,两全其美。
我们写一个函数 void fun(int a,int b),这样的函数调用时是不会改变参数的值的,在函数中也就是以一个局部变量的形式存在,当函数结束时,变量a,b的生命周期也就结束了。
而对于 void fun(int &a,int &b),这种形式进行参数传递,其实是一种指针的形式,如果在函数内我们改变了a,b的值,当函数结束后,原来的值也将被改变。
当参数是较大的数据结构类型时,而且我们不需要改变原变量中的值,那么我们为什么要使用void fun(vector<int> &a),而不使用void fun(vector<int> a)呢,因为void fun(vector<int> a)需要对原变量进行一次复制操作,即使两个变量名是相同的由于作用域不同,所以其实是两个变量,所以需要一次复制操作,因此当数据大小较大时是非常浪费时间的。
那么自然的就引出了这样的问题,我们使用void fun(vector<int> &a)不需要进行复制操作,但是不小心在函数中改变了参数的值不就得不偿失了。所以就有了void fun(const vector<int>
&a)这样的结构,我们都知道const关键字定义的变量是不可以被改变的,所以当我们进行常量引用时既不会进行复制操作,当误操作时又不能编译通过,两全其美。
相关文章推荐
- C++ 常引用 const int &a 的作用和区别
- C++中static_cast、const_cast、reinterpret_cast的用法举例,附带举例说明强制类型转换时int和int&的区别
- int的一点事,读《深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别》
- 参数 void aa(int a,int b) 与 void aa(int* a,int* b) 与 void aa(int& a,int& b)区别
- error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转"相关的问题
- const int& a = 100; 这种引用虽然可以, 但要少用或者不用
- int const* func(const int&) | const int* func(const int&) | int *func() const区别
- const int *x 和 int * const x, const int& x和 int const &x的区别
- C语言拾遗:常量指针与指针常量(const int *ptr, int const *ptr, int * const ptr, const int * const ptr区别)
- const int &x和int const &x有何区别
- const int & 和 int 的区别
- const int *p和int * const p的区别(常量指针与指向常量的指针)
- const int *p和int * const p的区别(常量指针与指向常量的指针)
- const int *p和int * const p的区别(常量指针与指向常量的指针) .
- error C2664: “BOOL CDC::TextOutW(int,int,const CString &)”: 不能将参数 3 从“const char [18]”转换为“const CStr
- error C2664: “BOOL CDC::TextOutW(int,int,const CString &)”: 不能将参数 3 从“const char [18]”转换为“const CString &”
- int的一点事,读《深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别》
- C++中static_cast、const_cast、reinterpret_cast的用法举例,附带举例说明强制类型转换时int和int&的区别
- 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)
- 参数的引用传递 swap(int &x,int &y)