条款21: 尽可能使用const】的更多相关文章

对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const: char *p = "hello"; // 非const指针, // 非const数据 const char *p = "hello"; // 非const指针, // const数据 char * const p = "hello"; // const指针, // 非const数据 const char…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法,可以参见我的博客@http://www.cnblogs.com/hust-ghtao/p/3735941.html. 本篇博客主要讲了应用const时应该注意的地方. 1 令函数返回一个常量值 令函数返回一个常量值,往往可以降低客户因错误而造成的意外,而又不至于放弃安全性和高效性.例如有理数ope…
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " hello"; char* p = greeting;  //non-const pointer,non-const data const char* p = greeting;  //non-const pointer,const data  声明p为一个指向常量的greeting的指针,p指向的对象…
如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施bitwise constness,但你编写程序时应该使用概念上的常量性(logical constness) 当const和non-const成员函数有实质等价的实现时,令non-const版本调用const版本可避免代码重复 关键字const允许你指定一个语义约束,即指定一个对象不被改动,编译器…
一.概述 使用const约束对象:可以获得编译器的帮助(指出相关出错的地方) const与成员函数:const重载.转型.避免代码重复 二.细节 1. 为什么有些函数要返回const对象(看上去没必要)? 返回const对象:a * b = c; //operator*()函数返回一个const对象,故该表达式错误 补充:我们的本意或许是a * b == c,此时返回const是没影响的,故返回const可以预防“没意思的赋值动作” 2. const成员函数不能避免对象被更改的情况 mutabl…
参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以再被修改 const int val = 90; val = 100;   错误 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改, 则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护 void f…
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenever possible) 1. const 与语义约束 const 允许指定一个语义约束(也就是指定一个"不该被改动"的对象),而编译器强制实施这项约束.它可以在 classes 外部修饰 global 或 namespace(见 Item2)作用域中的常量,或修饰文件.函数.或区块作用域…
目录 1. 总结 2. const对象 3. const函数返回值和函数参数 4. const成员函数 const成员函数的重要性 bitwise constness logical constness 5. 在const和non-const成员函数中避免重复 1. 总结 const可用于任何作用域内的对象.函数参数.函数返回值.成员函数自身,将这些内容声明为const可帮助编译器侦测出错误用法 对于const成员函数,C++编译器强制要求bitwise constness,但在编写程序时应该使…
const是常量的意思,它可以定义一个不可改变的量,主要用于以下几个地方: 1. 修饰变量,使之不可改变 举个例子: const int var = 3; 此时var的值就不能改变了.也正是因为const的变量不能轻易修改存储的值,所以在声明的时候就要初始化,这样就是不行的: const int var; 编译器就会报错. 2. 修饰指针 指针是特殊的变量,有时我们希望对它所指向的对象操作,而有时我们又希望对指针本身进行操作.同样,const应用于指针也有两个含义:一个是指向常量(指向的内容不可…
场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const data const char* p = greeting; // non-const pointer, const data char* const p = greeting; // const pointer, non-const data const char* const = greeting; //…
1.只要这(某值保持不变)是事实,就应该确实说出来,这样可以获得编译器的协助,确保这条约束不被违反. 2.keyword const 有很多种用法,但都简单易用. 2.1classes 外部修饰global/namespace作用域中的常量. 2.2修饰文件.函数.区块作用域中被声明的static 对象. 2.3修饰classes内部的static和non-static 成员变量. 2.4对于指针,可以指出ptr自身.ptr所指物或者两者都(或都不)是const. 这里不清楚static跟 co…
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.const 修饰成员变量 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int a1=3; ///non-const data 5 const int a2=a1; ///const data 6 7 int * a3 = &…
http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.const 修饰成员变量 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int a1=3; ///non-const data…
条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数,这笔开销还是很大的.现在的新编译器已经可以对这种情况进行优化了,甚至优化到连开销都没有,只是有一定的适用范围.如果可以返回一个匿名的临时对象,并且利用构造函数来得到结果对象,那么就有可能被优化到零开销.注意,有名字的对象意味着返回值优化不可用. 假设有如下的代码: node a(); node b(…
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. 因此很多情况下 const 关键字的使用方法也不是简单的 const + 变量,其用法总的来说是比较灵活的. 指针的 const 关键字 const 关键字出现在 * 左边或是右边定义出来的指针完全不同. const int *pa = &a; 这样的一行代码定义了一个指向整型变量 a 的指针 pa…
总结: 绝不要返回一个local栈对象的指针或引用:绝不要返回一个被分配的堆对象的引用:绝不要返回一个静态局部对象(为了它,有可能同时需要多个这样的对象的指针或引用). 条款4中给出了“在单线程环境中合理返回局部静态对象的引用”. 注意:利用指针返回一个被分配的堆对象是可以的.本条款讨论的是必须返回一个对象,所以返回一个对象的指针不包含在本条款内.那可能说,能返回对象的指针,为什么还需要返回一个对象呢?因为有的时候真的是需要返回一个对象,不能返回对象的指针. 提出问题 因为对象之间值传递是有效能…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#define不被视为语言的一部分,那正是它的问题所在.#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本.#define的基本用法有两种,都容易出现问题,C++也分别采用不同的方法进行解决. 1. 简单的宏定义 1.1 核心…
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.const 修饰成员变量 #include<iostream> using namespace std; int main(){ ; ///non-const data const int a2=a1; ///const data int * a3 = &a1; ///non-const d…
Effective C++在此条款中总结出两个结论 1.对于单纯常量,最好以const对象或enum替换#define 2.对于形似函数的宏,最好改用inline函数替换#define 接下来我们进行详细的探讨. const替换#define的讨论 例如: #define ASPECT_RATIO 1.653 原书给出的解释大意是: 你所使用的名称(ASPECT_RATIO)可能并未进入记号表(symbol table),原因也许是记号名称ASPECT_RATIO从未被编译器看见,也许在编译器开…
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. 因此很多情况下 const 关键字的使用方法也不是简单的 const + 变量,其用法总的来说是比较灵活的. 指针的 const 关键字 const 关键字出现在 * 左边或是右边定义出来的指针完全不同. const int *pa = &a; 这样的一行代码定义了一个指向整型变量 a 的指针 pa…
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象.条款4已经为“在单线程环境中合理返回reference指向一个local static对象”提供了一份设计实例.…
如下为一个有理数类,其中包含一个用来计算乘积的函数: #include <iostream> using namespace std; class Rational { public: Rational(, ) { n = numerator; d = denominator; } private: int n, d; friend const Rational operator*( const Rational& lhs, const Rational& rhs) { Rat…
1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中的迭代器是对指针的封装,因此,迭代器也有两个概念:指向常量对象的迭代器和常量迭代器. vector<int>::const_iterator; //指向常量的迭代器 const vector<int>::iterator; // 常量迭代器 3.const可以与方法产生关联,可以用在方…
速度 #include <iostream> using namespace std; class TextBlock { private: string text; public: TextBlock(string s) { text = s; } const char& operator[](size_t position) const {return text[position]; } char& operator[](size_t position) {return t…
将某些东西声明为const可以帮助编译器检测出错误用法,const 编译器强制实施bitwise constness,但是你code的时候应该使用“概念上的常量性” 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复. 0)迭代器类似T*指针,声明迭代器为const就像声明指针为const一样.(即声明一个T* const指针) 如果你希望迭代器所指的不能被改动,需要的是const_iterator vector<int>:…
//先看看下面这个例子 class Rational{ public: Rational(int num, int denu) :numirator(num), denumirator(denu); const Rational operator*(const Rational & lhs, const Rational & rhs);//注意这里的返回类型 private: int numirator; int denumirator; }; operator返回的是一个value而不是…
class Rational { public: Rational(, ) : n(numerator), d(denominator) { printf("Rational Constructor\n"); } ~Rational() { printf("Rational Destructor\n"); } Rational(const Rational& rhs) { this->d = rhs.d; this->n = rhs.n; pri…
NOTE: 1.绝不要返回pointer或reference 指向一个local stack 对象,或返回reference 指向一个heap-allocated对象,或返回pointer 或reference指向一个 local static 对象而有可能同时需要多个这样的对象.…
条款1:尽量用const和inline而不用#define 以const 行使常量折叠,用inline 代替常用操作的宏定义,而且库里面有很多常用函数可用.当然不能抛弃宏,宏还是很有用滴.偶最近才发现宏的可爱之处...咔咔. 条款2:尽量用而不用 iostream的 IO智能,灵活,类型安全.呃,效率要比 stdio的IO低些. 条款3:尽量用new和delete而不用malloc和free new/delete是转为C++设计的---它会自动调用构造析构函数. 恩,这也会造成不必要的性能损失.…
补充自己的. 转自:http://blog.csdn.net/ysu108/article/details/9853963#t0 Effective C++ 笔记 目录(?)[-] 第一章 从C转向C 条款1尽量用const和inline而不用define 条款2尽量用iostream而不用stdioh 条款3尽量用new和delete而不用malloc和free 条款4尽量使用c风格的注释 第二章 内存管理 条款5对应的new和delete要采用相同的形式 条款6析构函数里对指针成员调用del…