C++ const的那些事
来源:互联网 发布:淘宝数据包解压工具 编辑:程序博客网 时间:2024/05/23 19:24
C++ const的那些事
const和#define的抉择
const常量是编译运行阶段使用,const常量会在内存中分配。而define宏常量是在预处理阶段展开,有多少地方使用,就展开多少次,不会分配内存。const常量有数据类型,而define宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。并且const常量可以限定作用域,而define宏常量都是全局的。const既然有怎么多的好处,而且C++也推荐使用const,我们何乐不为了!
const类型的定义
非指针类型: const type name 或 type const name
//main.cpp# include<iostream>int main(){ const int var_1 = 123;//int类型的常量 double const var_2 = 1.23;//double类型的常量 /*常量类型只能由常量指针指向或常量引用引用*/ const int *var_3 = &var_1;//常量指针 int const *var_4 = &var_1;//常量指针 double const &var_5 = var_2;//常量引用 const double &var_6 = var_2;//常量引用 return 0;}
指针类型:
- 常量指针,即指向常量的指针(一个不能修改其指向对象的指针,可以接受const和非const类型数据)。
- 指针常量,指针类型的产量(一个不能修改其自身的指针,只可以非const类型数据)。
常量指针:const type *name 或 type const *name
//main.cpp# include<iostream>int main(){ const int var_1 = 123; int var_2 = 456; const int *var_3 = &var_1;//int const *var_3 = &var_1 var_3 = &var_2; return 0;}
指针常量:type * const name
//main.cpp#include<iostream>int main(){ int var_1 = 123; int * const var_2 = &var_1; return 0;}
引用类型:
常量引用,即指向常量的引用(一个不能修改其指向对象的引用,并且也不能修改其自身的引用,可以接受const和非const类型数据)。
常量引用:const type &name 或 type const &name
//main.cpp# include<iostream>int main(){ const int var_1 = 123; int var_2 = 456; const int &var_3 = var_1;//int const &var_3 = var_1; //var_3=var_2;常量引用不能修自身 return 0;}
const类型与函数
在函数传参时使用引用/指针传参时速度更快(无需进行拷贝),而使用const引用/指针既可以保证原始数据的安全性(将不能被修改),又有引用/指针传参的速度。const类型引用/指针的形参可以使得函数传参是可以处理const和非const类型的实参,若不使用const只能处理非const实参。const引用传参时形参与实参不匹配,c++将生成类型正确临时变量,并让参数引用临时变量(c++只有在const引用时才会这么做)。
//main.cpp# include<iostream>int sum_1(int &val_1, int &val_2){ return val_1 + val_2;}int sum_2(const int &val_1, const int &val_2){ return val_1 + val_2;}int sum_3(const double &val_1, const double &val_2){ return val_1 + val_2;}int main(){ int var_1 = 1; const int var_2 = 1; //sum_1(var_1, var_2);因为var_2是const int类型,无法被int &接受 sum_2(var_1 , var_2); sum_3(var_1, var_2);//由于参数类型不一致,sum_3生成正确的临时变量,并将参数引用临时变量 return 0;}
函数的返回值也可用const限定。当函数返回值为const引用/指针类型时,函数的返回值类型就必须要用const类型限定。
//main.cpp# include<iostream>const int & max(const int &val_1, const int &val_2){ if (val_1 >= val_2) { return val_1; } else { return val_2; }}int main(){ int var_1 = 1; int var_2 = 2; std::cout << max(var_1, var_2)<<std::endl; return 0; /* 2 */}
const类型与类
在c++中const可以限定类的成员,但由于const类型必须进行初始化,所以在c++中,const类型的类成员必须在类构造之前进行初始化,即在初始化列表进行初始化。
//main.cpp# include<iostream>class C{public: C():m_var(1){}//使用初始化列表进行初始化 ~C() {} const int m_var;};int main(){ C obj;}
在c++中const可以限定类的成员函数,即承诺在本函数内部不会修改类内的数据成员,不会调用其它非const 成员函数(非const成员函数可以调用const成员函数)。在分文件定义时需要在声明文件里和定义文件里分别用const限定类成员函数(那么多限定符,就它要声明和定义都限定)。
在c++中const限定的对象,只能调用const成员函数。当成员函数重载时,非const限定的对象,优先调用非const限定的成员函数。
#ifndef C.H#define C_Hclass C{public: C(); ~C(); void print()const; void print(); void swap();private: int m_var_1; int m_var_2;};#endif
//C.cpp#include "C.h"#include <iostream>C::C(){ m_var_1 = 1; m_var_2 = 2;}C::~C(){}void C::print(){ std::cout << "print " << m_var_1 << " " << m_var_2 << std::endl;}void C::print()const{ //swap();不能调用非const限定成员函数 //m_var_1=2;不能调用修改类成员 std::cout << "print const " << m_var_1 << " " << m_var_2 << std::endl;}void C::swap(){ int tmp; tmp = m_var_1; m_var_1 = m_var_2; m_var_2 = tmp;}
//main.cpp# include <iostream>#include "C.h"int main(){ C obj_1; const C obj_2; obj_1.print(); obj_1.swap(); obj_2.print(); //obj_2.swap();const对象不能调用非const限定的成员函数 return 0; /* print 1 2 print const 1 2 */}
- C指针与const的那些事
- const的那些事
- C++ const的那些事
- 指针和const的那些事
- 指针和const的那些事
- const和指针的那些事
- C++的那些事:const用法面面观
- const与指针的那些事
- const的那些小事
- C语言的那些小秘密之const修饰符
- C语言的那些小秘密之const修饰符
- C语言的那些小秘密之const修饰符
- C语言的那些小秘密之【const修饰符】
- C语言的那些小秘密之const修饰符
- c的那些事
- notes of c++ primer (3) -- const的那些事
- 【扩展知识7】谈const有关的那些事
- 初学C的那些事
- hdoj-2512-一卡通大冒险
- BestCoder Round #85 1001 1002
- UVALive 6613 Collision(物理解方程)
- 树莓派 使用xbox360手柄
- URAL 2025 Line Fighting 水题、贪心、均分
- C++ const的那些事
- 河南多校大一训练赛(贪心)
- break与return的作用
- 10019---访问远程Redis服务。Connect to Remote Redis Server
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- js一个事件绑定多个函数
- 浅谈服务器单I/O线程+工作者线程池模型架构及实现要点
- 华为OJ 初级:蛇形矩阵
- 设计模式(二)建造者模式