目录

1.const

1.1 const obj 如果调用 non-const member fun会编译出错

经典错误

1.2 例子:STD里的操作符重载

1.3 例子:《cpp primer》15节 -基类的定义


1.const

class complex
{
public:
complex (double r = 0, double i = 0): re (r), im (i) { }
complex& operator += (const complex&);
complex& operator -= (const complex&);
complex& operator *= (const complex&);
complex& operator /= (const complex&);
double real () const { return re; }
double imag () const { return im; }
private:
double re, im; friend complex& __doapl (complex *, const complex&);
friend complex& __doami (complex *, const complex&);
friend complex& __doaml (complex *, const complex&);
};

只有member fun后面可以用 const定义。成员变量后面不可以写const,写在前面。


1.1 const obj 如果调用 non-const member fun会编译出错

经典错误

如果定义时没有写成void print() const{}; 就会报错。因为str是const-obj,不能用non-const member fun调用。 


1.2 例子:STD里的操作符重载

来自 TEMPLATE CLASS basic_string的定义。string类的operator[]。

  • 用户可能拿[]来改变字符串。如String str[5]="a";由于string的实现机制是共享模式,不可以直接改变内部内容。只能拷贝一份再改变。所以要做cow(copy on write)设计。
  • 如果const String str[2];str是const obj,其内部不可以动。所以不必考虑cow。const obj只会调用const fun,所以const fun不必写cow。
reference operator[](size_type _Off)
{
// 下标可变序列
// 必须考虑cow return (this->_Myptr()[_Off]);
} const_reference operator[](size_type _Off) const
{
// 下标不可变序列
// 不必考虑cow return (this->_Myptr()[_Off]);
}
  • 可见const属于签名的一部分,这两个函数可以重载。
  • C++规定:如果类中有成员函数的const fun 和nonconst fun同时存在,则const obj默认调用const fun,non-const obj默认调用non-const fun。
  • C++规定:non-const fun(obj可变)可以调用const fun(obj不可变)。 反过来报错。

1.3 例子:《cpp primer》15节 -基类的定义

class Quote {
/*
** istream&:必须是非常量,因为本操作就是向流读出数据,其状态会改变;
** Quote& :必须是非常量,因为本操作就是向此对象写入数据,此对象值会改变;
*/
friend istream& operator>>(istream&, Quote&); /*
**ostream& :必须是非常量,因为本操作就是向流写入数据,其状态会改变;
**const Quote& :引用是因为避免赋值实参;常量是因为通常打印对象不会改变对象本身的值;
*/
friend ostream& operator<<(ostream&, const Quote&); public: /*这种传递中的代码使用以下变量来控制编译;
**变量:IN_CLASS_INITS/DEFAULT_FCNS;对应C++作用:类初始状态设置/default(默认);
*/
#if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)
//若定义类初始值设置及默认值,则定义默认构造函数,不接受任何实参;
Quote() = default;
#else
/*若未定义类初始值及默认值,则定义构造函数,函数体空;
**构造函数初始列表为新创建的数据成员price初始化,对应初始化值为 0.0;
*/
Quote() : price(0.0) { }
#endif // !defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS) //初始化构造函数
Quote(const string &book,double sales_price):
bookNo(book),price(sales_price){ } //虚析构函数,动态绑定
#ifdef DEFAULT_FCNS
virtual ~Quote() = default;
#else
virtual ~Quote() { }
#endif // DEFAULT_FCNS //const fun。 因为bookNo被期望是const obj,所以只能被const fun调用,必须定义为const fun,否则报错。
string isbn() const
{ return bookNo; } //虚函数。将在派生类中重写,根据书的数量,采取不同的折扣算法。
//因为price(定价)也是const obj,不会被改。所以定义为const fun。
virtual double net_price(size_t n) const
{ return n*price; }//虚函数返回动态分配的自身副本 private:
const string bookNo;//书号,被期望是const obj protected: #ifndef IN_CLASS_INITS
const double price = 0.0;
#else
const double price;
#endif // !IN_CLASS_INITS
};

C++声明之CV限定符的更多相关文章

  1. C++说明符和限定符

    有些被称为存储说明符(storage class specifier)或cv-限定符(cv-qualifier)的C++关键字提供了一些有关存储的信息.下面是存储所说明符:* auto (在C++11 ...

  2. C++const限定符

    在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...

  3. const 限定符

    1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...

  4. CUDA1.1-函数类型限定符与变量类型限定符

    这部分来自于<CUDA_C_Programming_Guide.pdf>,看完<GPU高性能变成CUDA实战>的第四章,觉得这本书还是很好的,是一种循序渐进式的书,值得看,而不 ...

  5. 限定符【const】用法大全

    1. 限定符声明变量只能被读 const int i=5; int j=0; ... i=j; //非法,导致编译错误 j=i; //合法 2. 必须初始化 const int i=5; //合法 c ...

  6. C++ Primer 第二章 引用 指针 const限定符

    1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...

  7. OpenGL ES 2.0 限定符

    限定符 说明 作用 attribute 一般用于各个顶点各不相同的量,如顶点位置.颜色等 属性限定符,修饰的变量用来接收渲染管线传递进顶点着色器的当前顶点的各种属性值. 只能用来修饰符点数标量,浮点数 ...

  8. C++ const 限定符

    C++ const 限定符 作用:把一个对象转换成一个常量 用法:const type name = value; 性质:1. 定义时必须初始化,定义后不能被修改.2. 类中的const成员变量必须通 ...

  9. C++之const限定符

    作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...

随机推荐

  1. [转]jQuery Mobile: Get data passed to page via changePage mobile.changePage

    本文转自:http://stackoverflow.com/questions/15840611/jquery-mobile-get-data-passed-to-page-via-changepag ...

  2. WSGI学习系列Pecan

    Pecan Introduce Pecan是一个轻量级的基于Python的Web框架, Pecan的目标并不是要成为一个“full stack”的框架, 因此Pecan本身不支持类似Session和D ...

  3. (转)Linux命令之md5sum

    Linux命令之md5sum  原文:https://www.cnblogs.com/zhuxiaohou110908/p/5786893.html 1. 背景 在网络传输.设备之间转存.复制大文件等 ...

  4. 微信web开发者工具 && 微信调试页面

    微信开发者工具 做微信公众号的过程中,自然避免不了登录账号然后进行调试,但是在chrome上我们没有办法登录,这是一个令人头疼的问题,比如这个公众号网页,只会提示出错,因为开发者限制了公众号网页的登录 ...

  5. SolrCloud的搭建的连接

    1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud.当一个系统的索引数据量少的时候是不需 ...

  6. HDU 4349——Xiao Ming's Hope——————【Lucas定理】

    Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化c,seria ...

  8. c# 远程连接sql server 2008问题

    http://hi.baidu.com/lzghxjt/item/d42bd8f7066a3ad86325d280 远程连接不上可以在防火墙新建入站规则

  9. 树莓派直连线连接PC

    刚入手树莓派一天不到,SSH树莓派一直用的是路由+无线网卡的配置.想到明天就要出差了,本想把树莓派也带去,可宾馆的房间只有一个网口,通常都是兄弟们连接小型无线路由用的,连接树莓派似乎成了一个难题.于是 ...

  10. poj 1947 树形背包

    重做这道题 http://blog.csdn.net/woshi250hua/article/details/7632785 http://blog.csdn.net/shuangde800/arti ...