C++ 常量引用

普通引用为形参的函数,一般会更改实参的值;以常量以及常量引用为形参的函数,一般不对实参进行修改。

常量引用兼有常量和引用的优点。不会新创建一个变量然后进行拷贝,而是直接传对象,速度快,同时保证了在函数内部无法对对象进行修改。

通常,引用的类型必须和所引用的类型一致,但常量引用在类型不匹配时,编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作。普通引用则没有这样的过程。

这个过程的一个作用是让不匹配的类型隐式转换成需要的常量类型。一个典型的例子如下:

int g1(string &str){}
int g2(const string &str){}
int main(){
    g1(".."); //failed
    g2("..");
}

常量引用为形参时,形参指向实参的空间;而常量为形参时,编译器会给形参重新分配空间

int f(const int x) {cout<<&x<<endl;}
int g(const int &x) {cout<<&x<<endl;}
int main() {
    int n=1;
    cout<<&n<<endl;
    f(n);
    g(n);
}
0x3beafe1c
0x3beafdf0
0x3beafe1c

原文地址:https://www.cnblogs.com/mollnn/p/12598961.html

时间: 2024-10-13 11:58:30

C++ 常量引用的相关文章

引用专题(续)=》 常量引用

常引用分两点: 1 使用变量初始化const引用 const int &a = b 2 使用字面量常量初始化const引用  const int &m = 10: #include <iostream> using namespace std; void main() {     //普通引用     int a = 10;     int &b = a;     printf("b"%d\n",b);               //常引

重载 与常量引用

void print(int a,int b,int =0){ cout<<"执行三个参数的"<<endl; } void print(int a,int b){ cout<<"执行两个参数的"<<endl; } //以上两个,在使用函数print(3,5);//error:ambiguous call to overloaded function void print(int a){//注意返回类型 cout<

对const的引用(常量引用)

引用的类型必须与其所引用对象的类型一致.但是,对const的引用是第一种例外情况. 对const的引用,常简称为"常量引用". 常量引用的初始值可以是任意表达式,只要该表达式的结果能转换成引用的类型即可. 但是,对于字面值,一般表达式以及与常量引用类型不一致的对象作为常量引用的初始值,常量引用实际绑定到了临时变量上.测试代码如下: 1 #include <iostream> 2 3 int main() 4 { 5 int i = 42; 6 int &r1 = i

const常量引用的使用方法

C++编程语言中,对于常量的引用是一个非常重要的应用技巧.在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识. C++单例模式基础内容详解 C++创建Web服务相关方法剖析 C++构造函数如何进行初始化 C++标识符命名规则相关应用技巧分享 C++函数模板基本概念讲述 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对C++常量引用可以用其它任何引用来初始化:但不能改

常量引用 const T&amp;

1.引用本身不是对象,只是引用对象的别名,没有内存空间产生 2.引用必须严格类型匹配 3.而常量引用 const T& 可以引用字面值常量及表达式 其实也就是右值,且常量引用的不同与T类型对象时,如果可以类型转换则会类型转换为T类型常量引用,不过会产生临时变量(C++ Primer): code: double d=25.0; const int& a=d; implicit code: double d=25.0; const int temp=d; const int& a=t

C++ 常量引用与临时变量

由 <<C++ Primer>> 练习7.49 (b) 产生出来的小问题. 总结: 1.不要对临时变量进行改变.要传递临时变量,得用常量引用. 2. 当引用不需要更改时,用const引用. 问题: struct Sales_data { Sales_data() = default; Sales_data(std::string &str){} Sales_data& combine( Sales_data&); }; Sales_data& Sal

类初始化 常量引用

class ConstClass{ static { System.out.println("ConstClass init"); } public static final String HELLOWORLD = "hello world";}class NotInitialzation{ public static void main(String[] args){ System.out.println(ConstClass.HELLOWORLD); //只是输

[转载]非常量引用的初始值必须为左值的问题

首先,先看下面一个例子: eg.1 #include<</span>iostream> usingnamespace std; int main(){ int i =2; double &r =i; return 0; } gcc error: invalid initialization of reference of type 'double&' from expression of type 'int' 如果改成 const double &r =i;

推荐形参使用常量引用:void func(const T &amp;);

一.声明为const的原因: 把函数不会改变的形参定义成普通的引用会带给函数的调用者一种误导,即函数可以修改它的实参的值: 限制函数所能接受的实参类型,如不能把const对象.字面值或者需要类型转换的对象传递给普通引用的实参. 举例:对于附录中的"find_char函数",由于我们把其中的string类型的形参定义成普通的string&,故只能将find_char函数作用于string对象,对于下面这样的调用,将在编译时发生错误. find_char("Hello W