博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ item 2&3
阅读量:3576 次
发布时间:2019-05-20

本文共 1176 字,大约阅读时间需要 3 分钟。

条款2,3:使用const

1. const 和 pointer

char p[] = {"1233"};const char* ptr = p;const char* str = "awk";

字符串的存储位置

其中str指向字符串常量,存储在代码段,ptr指向数据段。const 修饰不能通过指针修改所指之物。但是指针的指向可以修改。

char s[] ={"5678"};ptr = s; //上述指针指向s

同时使用const修饰指针和所指向之物时:

const char * const ppt = s;

2. const 和 class

class Exa{	public:	//...构造析构	const char& operator[](std::size_t pos) const{		...  //运算		return arr[pos];	}	char &operator[](std::size_t pos){		...  //运算		return arr[pos];	}	char &operator[](std::size_t pos) const{		...  //运算		return arr[pos];	}	private:	const int SIZE = 100;	char *arr;};

const与non-const会构成重载,第一个operator[]中的const是限制函数不可修改成员并且不可修改返回值,第二个未进行const限制,第三个const限制不能再函数中修改成员,但是它返回的引用会在函数外部进行对函数内部的修改,相当于自己将成员的内部暴露在外,所以一般不应用这样的修改方式。

class Exa{	public:	//...构造析构	const char& operator[](std::size_t pos) const{		...  //运算		return arr[pos];	}	char &operator[](std::size_t pos){		return const_cast
(static_cast
(*this)[pos]); } private: const int SIZE = 100; char *arr;};

所以如上,一般只保留前两种的[]的重载,但是这个重载在功能上的重复太多,有一点代码膨胀的嫌疑,所以将第二个非const的重载中将const移除。解释:添加const的转型使用static_cast<>进行了一次安全转型(将non-const对象转换为const对象),使用const_cast<>进行了一次移除const的操作。

const不仅可以作用于成员方法,也能作为成员对象,SIZE,给定初值,构造时使用。

转载地址:http://pcxgj.baihongyu.com/

你可能感兴趣的文章
存储器知识要点
查看>>
Cache模拟器的实现
查看>>
设计模式七大原则
查看>>
SpringBoot入门(二)场景启动器
查看>>
SpringBoot入门--自动配置
查看>>
自动配置原理
查看>>
TCP协议
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
spring注解版(一)
查看>>
SpringBoot中访问控制层(controller)得不到Json数据
查看>>
BFC(Block Formatting Context)
查看>>
什么是作用域,什么是闭包,什么是作用域链
查看>>
惰性求值,面向对象
查看>>
数据结构之列表
查看>>
es5中的arguments对象
查看>>
git本地仓库和远程仓库关联,分支重命名
查看>>
js对象的深拷贝,你真的觉得很简单吗?
查看>>
你真的了解map方法吗?手动实现数组map方法。
查看>>
带你手动实现call方法,让你收获满满
查看>>
前端知识体系
查看>>