随着学习的深入,就会发现曾经学的const还有更深入的用法,现在就对const的未总结的用法进行总结。

本文就是针对const在类中的情况进行的总结。

有时我们会遇到下面这种将类的成员变量用const进行修饰的情况

class Coordinate
{
public:
Coordinate(int x,int y);
private:
const int m_iX;
const int m_iY;
}

在这种被const修饰过的成员变量进行赋值的时候需要注意:

Coordinate::Coordinate(int x,int y)
{
m_iX = x;
m_iY = y;
}

这种赋值方式是错误的,需要用初始化列表,如下:

Coordinate::Coordinate(int x,int y):m_iX(x),m_iY(y)
{
}

当然如果这个类的成员变量的类型是另一个类,也被const修饰,如下:

class Line
{
public:
Line(int x1,int y1,int x2,int y2);
private:
const Coordinate m_coorA;
const Coordinate m_coorB;
}

那么,他的初始化依旧是只能使用初始化列表:

Line::Line(int x1,int y1,int x2,int y2):
m_coorA(x1,y1),m_coorB(x2,y2)
{
cout<<"Line"<<endl;
}

当然,const不止能修饰成员变量,也能修饰成员函数,下面就对Coordinate类进行稍作添加修改:

class Coordinate
{
public:
Coordinate(int x,int y);
void changeX() const;
void changeX();
private:
const int m_iX;
const int m_iY;
}

其中,我们重载定义了两个changeX成员函数,其中一个用const修饰,那么我们需要注意下面一个问题:

void Coordinate::changeX() const
{
m_iX=;//错误
} void Coordinate::changeX()
{
m_iX=;
}

被const修饰的成员函数(即常成员函数)不能改变数据成员的值,

是因为编译时会变成下面的样子

void changeX(const Coordinate *this)
{
this->m_iX=;
}

会隐含着this指针,这个this指针是被const修饰的,可以看到关键字出现在星号的左边,表示被指物是常量,所以被指物的子项是不能进行赋值的。

虽然这两个changeX是重载的,但是一定要分清楚什么时候调用哪个。

int main(void)
{
const Coordinate Coordinate(,);//常对象
Coordinate.changeX();//调用的是常成员函数
return ;
}

只有用const修饰并声明的常对象才能调用常成员函数。

【3.1】学习C++之再逢const的更多相关文章

  1. es6学习笔记1 --let以及const

    let语句的基本用法:  1.let声明的变量为块级作用域,只在最近的{}里面有效,如果在外部引用就会报错. { let a = 10; var b = "hello" } ale ...

  2. c++学习总结--复合类型,const。

    复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...

  3. ES6-个人学习笔记一--let和const

    es6已经推出一段时间了,虽然在兼容和应用上还有不少的难题,但是其提供的未来前端代码编程的发展趋势和一些好用的功能还是很吸引人的,因此个人买了'阮一峰'先生的es6入门,希望对其有一个了解和学习,本系 ...

  4. Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络

    from:http://www.cnblogs.com/kemaswill/p/3266026.html 1. 多层神经网络存在的问题 常用的神经网络模型, 一般只包含输入层, 输出层和一个隐藏层: ...

  5. ES6学习笔记(一)——let和const

    1.ES6学习之let.const (1).var.let.const 变(常)量声明 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 在ES6中let就诞生了,实际上它 ...

  6. 开始学习es6(二) let 与 const 及 块级作用域

    1.var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方声明的,都会提升到当前作用域的最顶部,这种行为叫做变量提升(Hoisting) cons ...

  7. ES6学习笔记(1)----let和const命令

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ let和const命令 let 总结1.声明变量基本使用方法与var 相同  不同点  a.在代 ...

  8. IBatis.Net学习笔记六--再谈查询

    在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的 ...

  9. PHP学习笔记三十一【const】

    <?php //常量都是public类型 // const 常量名=赋值 .变量名不需要加$符号,也不需要要访问修饰符,默认就是public class A{ const TAX_RATE=0. ...

随机推荐

  1. kernel: nfsd: too many open TCP sockets, consider increasing the number of threads

    在/var/log/syslog中看到如下报错:   kernel: nfsd: too many open TCP sockets, consider increasing the number o ...

  2. MySql || 快速创建100w条记录

    平时每个开发者都会讨论数据量大时,sql的优化问题.但是并不是每个人都会有100w的数据量可以用来实战,那么今天我们就自己动手,模拟一个100w数据量的表. 创建原理 其实创建的方法有很多,有快的也有 ...

  3. 手写xpath定位公式

    做web自动化,之前我们已经将环境搭建好了,现在的话总结下怎么定位元素的 最基本的元素定位是有6种: driver.find_element_by_id("") driver.fi ...

  4. Go如何使用数据库、缓存

    database/sql 接口 Go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口database/sql,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,只要是按照 ...

  5. HDU5952 dfs+剪枝

    题目分析: 对于给出的n个点和m条边,求这个图的完全联通子图的数量(每次查询的子图的大小为s),对于本题而言,很容易想到的是dfs暴力和这个点相连的所有的点,并且判断这个图是否是度为s 的完全联通子图 ...

  6. 【转】Pandas学习笔记(五)合并 concat

    Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...

  7. HDU - 5126: stars (求立方体内点数 CDQ套CDQ)

    题意:现在给定空空的三维平面,有加点操作和询问立方体点数. 思路:考虑CDQ套CDQ.复杂度是O(NlogN*logN*logN),可以过此题. 具体的,这是一个四维偏序问题,4维分别是(times, ...

  8. 记录一次群答问:requests获取cookie

    问题: 为了测试,写的sever,下面仅为set cookie的部分代码 response = make_response('{"code":9420, "msg&quo ...

  9. 18-C#笔记-继承

    1. 子类可以使用父类的成员和函数. 和C++不同,使用的是一个冒号 2. 不支持多重继承 但是可以通过接口(interface)这种结构实现.后续讲解. using System; namespac ...

  10. reactnative遇到的问题总结

    1.View中出现文本报错,View等标签中不能出现字符串文本,字符串文本需要包在Text中,遇到如下错误 下面是问题代码: let rightTitle = this.props.rightTitl ...