随着学习的深入,就会发现曾经学的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. How to: Create a C/C++ Union by Using Attributes (C#)

    [How to: Create a C/C++ Union by Using Attributes (C#)] 1.you can create what is known as a union in ...

  2. Win10开启快速启动后关机变重启

    同样可以用来解决,“msconfig引导为空”,“默认操作系统为空”,“win10改为uefi启动后关机变重启”,“legacy转uefi后无法关机” 问题起因 换完主板和cpu后,新的主板在开机时总 ...

  3. 如何让ThinkPHP支持模糊搜索

    最近ytkah在做一个ThinkPHP的项目时发现了一个问题,搜索的功能只能检索出以*为开头的内容,不能检索出中间的词.例如:搜索包含6775的产品,搜索结果为空,而搜索000-6775 就有两个结果 ...

  4. 使用Git管理品优购项目 开始部分

  5. RabbitMQ六种队列模式-工作队列模式

    前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...

  6. Candy Treasure Box

    This is an interesting puzzle game. In the game, you need to use your brain, think carefully, operat ...

  7. 你好,我叫Flask

    首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...

  8. requests.session()会话保持

    可能大家对session已经比较熟悉了,也大概了解了session的机制和原理,但是我们在做爬虫时如何会运用到session呢,就是接下来要讲到的会话保持. 首先说一下,为什么要进行会话保持的操作? ...

  9. html 指定页面字符集的两种方式

      1.html指定页面字符集的两种方式 方式一: <meta charset="utf-8"> 方式二: <meta http-equiv="Cont ...

  10. java基础之 数据类型 & 值传递 引用传递 & String & 四种引用类型

    一.Java数据类型 分为基本数据类型与引用数据类型 基本数据类型: byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个 ...