const引用和constexpr】的更多相关文章

1.const指针 eg: (1)  int const * p = nullptr; p = new int[10]; p[3] = 4; //error 我们发现第三行没法编译,这是因为第一行的const限制的时int,意思就是无法改变p所指的int类型的值. (2) int * const p = nullptr; p = new int [10]; //error 这是为什么呢?原来时因为const限定的是int*,也就是限定的是指向int*的指针,也就是p指针:所以第二行是报错的.因为…
1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了. 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起一个申请,编译器可以拒绝用户的请求.内联函数只用在普通函数的开头加上inline关键字. 当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度.节省时间但是消耗空间. inline函数的规则 (1)含有递归调用…
(1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival = 1092; 2 int &re = ival;   //ok 3 int &re2 = &ival;   //错误 4 int *pi = &ival; 5 int *&pi2 = pi;   //ok (2)       一旦引用已经定义,它就不能再指向其他的对象…
一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; const refB=B; //const变量的声明和初始化 ;//字面值给const赋值 ;//错…
1.为什么使用传const引用? a.被调方法中,形参不再进行copy构造,以及析构,提高效率. b.传值,会出现对象切割的问题. 2.有没有例外? 在编译器底层,引用是使用指针实现的.这就意味着,如果对象是内置类型,迭代器,函数对象,传值效率更高.因为传引用也就是传指针,而内置类型,迭代器,函数对象copy构造效率也很高,不会比copy构造指针效率差.…
在C++中可以声明const引用 const Type& name = var: const引用让变量拥有只读属性 const int &a = b const int &a = 10; Case1: <pre name="code" class="cpp">#include <iostream> using namespace std; //常引用的知识架构 int main() { //普通引用 int a = 1…
拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = fun(t1); 2,如果自定义类型的拷贝构造函数的参数没有用const修饰了:必须用下面的方式接收 const Test& t2 = fun(t1); Test t2 = fun(t1);//编译不通过 编译错误: cannot bind non-const lvalue reference of…
1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是objdump –d xx底层编译器实现其实还是指针. (1)引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. ; ; //错误.非常量引用的初始值必须为左值 int &re = ival; //ok int &re2 = &ival; //错误.不可用对象…
一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = ival; // ok: both reference and object are const int &ref2 = ival; // error: non const reference to a const object 可以读取但不能修改 refVal ,因此,任何对 refVal 的赋值都是不合…
int f (int & I) { cout<<I<<std::endl; } void main() { long L; f(L); // 编译不过 f((int)L); // 编译不过 f((int&)L);// 编译过 } 编译不会通过,这种情况下pL不会自动转换成int *,因为类型转换会生成临时变量,不能接收函数返回值 void func(int *& a){}; void * p; int * pint; func(pint); func((in…
void print1(int a) { cout<<a<<endl; } void print2(const int& a) { cout<<a<<endl; } void print3(int& a) { cout<<a<<endl; } int main() { ; int& b = a; const int& c = a; print1(a); print1(b); print1(c); pri…
转自:http://blog.csdn.net/u011068702/article/details/64443949 1.看代码 2.编译结果 3.分析和解决 就拿f(a + b)来说,a+b的值会存在一个临时变量中,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,因为c++编译器的一个关于语义的限制.如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用.但如果你把一个临时变量当作非cons…
(1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival = 1092; 2 int &re = ival;   //ok 3 int &re2 = &ival;   //错误 4 int *pi = &ival; 5 int *&pi2 = pi;   //ok (2)       一旦引用已经定义,它就不能再指向其他的对象…
const 引用: 在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可.尤其,允许为一个常量引用绑定非常量的对象.字面值,甚至是一个表达式.我们来看 const 引用的分析: #include <iostream> int main(int argc, char* argv[]) { ; ; } 该代码的汇编代码如下: int main(int argc, char* argv[]) { 00964C80 push ebp 00964C81 mov ebp…
const引用的作用: 1. 避免不必要的复制.  2. 限制不能修改对象. const 引用的是对象时只能访问该对象的const 函数  例: class A { public: void constFunc() const; void nonConstFunc(); }; A a ; const A& ref=a;//A& const ref = a;则没有问题,我也不清楚为什么 ref.constFunc();//正确 ref.nonConstFunc();//错误,该函数中可能会修…
先简单回忆一下常量的性质: int main() { const int buffSize = 512; buffsize = 512; //× buffSize是常量 } 初始化时: const int i = get_val(); //√ 运行时初始化 const int j = 42; //√ 编译时初始化 const int k; //× k未经初始化 当用一个对象去初始化另外一个对象,他们是不是const就无关紧要 int i = 42; const int ci = i; int j…
C++ 关于const引用的测试 今天学习了<C++ primer>第五版中的const相关内容,书中关于const的部分内容如下: 由书中内容(P55~P56)可知,const引用有如下几种常见例子: 第一种: int i=10; const int &r1=i; //输出r1=10 i=20; cout<<r1; //输出r1=20 此时const引用r1是变量i的引用,对r1不可进行修改赋值等操作,但是我们可以修改变量i已达到间接修改r1的目的,其原因是r1是一个co…
函数返回值为 const 指针,可以使得外部在得到这个指针后,不能修改其指向的内容.返回值为 const 引用同理. class CString { private: char* str; public: const char* c_str() const; }; const char* CString::c_str() const { return str; } int main() { CString s; const char* p = s.c_str(); } 下面的两条语句编译时都会报…
工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_algobase.h::, /bits/char_traits.h:, /, , : /usr/local/include/c++//bits/stl_pair.h: In instantiation of ‘struct std::pair<const std::__cxx11::basic_st…
默认情况下C++以pass-by-value传递对象至函数(或从函数返回). eg1: class Person { public: Person(); virtual ~Person(); private: std::string name; std::string address; }; class Student: public Person { public: Student() ~Student(); private: std::string schoolName; std::stri…
举个例子, void f(const int &x) 和 void f(int &x) 是不同的函数. 函数的返回值不能作为区分…
没找到具体原因,MSDN看到下面这句,VC是从2008才有这一限制的,感觉就是从语法上对临时变量增加了限定,因为一般说来修改一个临时变量是毫无意义的,通过增加限定,强调临时变量只读语义.虽然实际上修改临时变量并不会有问题. Visual Studio 2008 In previous releases of Visual C++, non-const references could be bound to temporary objects. Now, temporary objects ca…
为什么呢?因为传值函数,需要调用拷贝构造函数,那就层层循环无止境了.…
先说结论相同点:const和consexpr都是用来定义常量的.不同点:const声明的常量,初始值引用的对象不一定是一个常量:constexpr声明的常量,初始值一定是常量表达式. constexpr是c++11标准添加的关键字. 之所以说const声明的常量,初始值不一定是一个常量,主要是从引用和指针的角度出发的.如果初始化const时候,指定一个固定的字面值常量,那么它引用的肯定是常量. ; constexpr ; 这种情况下,i和j都是常量,而且它们引用的也是一个常量(因为是固定的字面值…
#include<iostream> //const 和 引用的值必须初始化 //等号左侧是const或者const和引用,右侧可以是数字,普通变量-等号左侧是const和指针,右侧必须是const或者引用 --- //---但是等号右侧是const,则左侧必须是const using namespace std; int j = 0; //这里规定i和j都必须定义在函数体外 constexpr int i = 2; //这里规定i和j都必须定义在函数体外 int main() { const…
C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error. 对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变).C++中采用的是物理常量性,例如下面的例子: struct A { int *ptr; }; int k = 5, r = 6; const A a = {&k};…
编译器将在编译过程中把用到const变量的地方都替换成对应的值,为了执行这种替换,编译器必须知道变量的初始值.如果程序包含多个文件,则那个用了const对象的文件都必须能访问到它的初始值才行.要做到这一点,就必须在每一个用到变量的文件中都有对它的定义.为了支持这一用法,同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效.当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量. 某些时候有这样一种const变量,它的初始值不是一个常量表达式…
在C++中,const 这个关键字用法非常灵活,导致我总会搞不清作用是干啥的.灵活使用const会大大改善程序. const 是C++的一种类型修饰符,是不可改变的不能被更新的. 1.const 修饰成员变量 const int a = 1; 此时的a在后面的操作中不能被改变,否则会报错 2.const 修饰函数参数 (1)void f( const int i ){}    防止意外的修改,增强程序的健壮性,同样在函数内不能被修改 (2)void f(const int* i){} 指针所指的…
const expression , 常量表达式 , 在<C++ Primer>的定义:值不会改变并且在编译过程就能得到计算结果的表达式.   它要求两点:值不会改变,编译过程得到结果. 因此不是所有的const常量都是常量表达式. ; // YES ; //YES const int sz = get_size(); // NO ,函数必须运行后才能得到结果(不考虑constexpr函数) : 是常量,但是不是常量表达式 因此,我们引出constexpr关键字,来验证是否为一个const e…
摘要:     非const 引用形参只能与完全同类型的非const对象关联.      具体含义为:(1)不能用const类型的对象传递给非const引用形参:                  (2)实参类型必须与非const引用形参的类型完全一致,例如,不可以将一个float对象传给 double &类型的引用形参:                        (3)不能将一个右值类型的实参 传递给 非const引用形参.       建议:在不需要修改实参的值的前提下,尽量使用cons…