-----------------siwuxie095

常对象成员 和 常成员函数

看如下实例:

定义一个坐标类:Coordinate

要想正确的初始化,必须通过初始化列表来初始化,因为两个数据成员

都是由 const 来修饰的,是常数据成员

作为一个类的数据成员来说,是可以用 const 来修饰的

显然,对象作为数据成员,也是可以用 const 来修饰的,称之为 常对象成员

以线段为例:当线段的位置一旦确定,就不能再更改

定义一个线段类:

因为要实现两个点一旦初始化,就不能再修改,需要定义成 const

在构造函数中通过初始化列表来初始化:

在使用时:

const 不仅可以修饰数据成员,还可以修饰成员函数

const 修饰的成员函数,称之为 常成员函数

「常成员函数中,const 修饰的实际上就是 this 指针」

看如下实例:

定义 changeX() 函数:上面的写法是错误的,下面的写法是正确的

常成员函数中为什么不能修改数据成员的值呢?

当定义 changeX() 函数时,看上去没有任何的参数,而实际上

却隐含着一个参数:this 指针

当成员函数不是一个普通的成员函数,而是一个 const 修饰过的

常成员函数时,依然有一个隐含的参数:this 指针,但 this 指针

是用 const 来修饰的,是一个常指针。通过常指针去改变该指针

指向的数据,肯定是不被允许的

所以,如果在常成员函数中去修改数据成员的值,这种做法就一定是错误的

此外,changeX() 和 changeX() const 二者互为重载

虽然从语法的角度来说,这个的确可以有,但如果真要去这么定义的话,

那我还是挺佩服你的,就像佩服孔乙己知道 回 字有 4 种写法一样

因为这样定义,接下来在使用时,肯定会感到疑惑:调用的是哪个成员

函数?实际上调用的是不带 const 的普通的成员函数 changeX()

那么在什么情况下可以调用常成员函数?

在实例化对象时,必须用 const 来修饰这个对象,这样实例化的

对象,称之为 常对象

通过常对象调用的 changeX(),就是用 const 修饰的常成员函数

程序:

Coordinate.h:

class Coordinate

{

public:

Coordinate(int x,int y);

~Coordinate();

void setX(int x);

//const修饰后只具有只读权限所以可以修饰get函数

//相当于 int getX(const Coordinate *this);

int getX() const;

//而set函数具有写权限所以不能用const(不能修改函数里面的值)修饰

void setY(int y);

int getY() const;

private:

int m_iX;

int m_iY;

};

Coordinate.cpp:

#include "Coordinate.h"

#include <iostream>

using namespace std;

Coordinate::Coordinate(int x, int y)

{

m_iX = x;

m_iY = y;

cout << "Coordinate() " << m_iX << "," << m_iY << endl;

}

Coordinate::~Coordinate()

{

cout << "~Coordinate() " << m_iX << "," << m_iY << endl;

}

void Coordinate::setX(int x)

{

m_iX = x;

}

int Coordinate::getX() const

{

return m_iX;

}

void Coordinate::setY(int y)

{

m_iY = y;

}

int Coordinate::getY() const

{

return m_iY;

}

Line.h:

#include "Coordinate.h"

class Line

{

public:

Line(int x1,int y1,int x2,int y2);

~Line();

void setA(int x, int y);

void setB(int x, int y);

//常成员函数注意:const和括号之间要隔开一个空格不然有些编译器下可能无法通过

//相当于 void printInfo(const Coordinate *this);

//也就是说常成员函数的const实际上修饰的是this指针使之成为常this指针

void printInfo() const;

// void printInfo(Coordinate *this); 隐藏的this指针

//同名的普通成员函数和常成员函数互为重载

void printInfo();

private:

const Coordinate m_coorA;//一个常对象成员

Coordinate m_coorB; //一个对象成员

};

Line.cpp:

#include "Line.h"

#include <iostream>

using namespace std;

Line::Line(int x1, int y1, int x2, int y2) :m_coorA(x1, y1), m_coorB(x2, y2)

{

cout << "Line()" << endl;

}

Line::~Line()

{

cout << "~Line()" << endl;

}

void Line::setA(int x, int y)

{

//m_coorA是常对象成员无法使用普通成员函数使用导致报错

//因为:setX(int x); 相当于 setX(Coordinate *this,int x);

//传进去的是m_coorA的常this指针(只读)m_coorA是个只具有读权限的对象

//而原函数里的this既有读权限又有写权限

//

//m_coorA.setX(x);

//m_coorA.setY(y);

}

void Line::setB(int x, int y)

{

m_coorB.setX(x);

m_coorB.setY(y);

}

void Line::printInfo() const

{

cout << "printInfo() const" << endl;

cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;

cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;

}

void Line::printInfo()

{

cout << "printInfo()" << endl;

cout << "(" << m_coorA.getX() << "," << m_coorA.getY() << ")" << endl;

cout << "(" << m_coorB.getX() << "," << m_coorB.getY() << ")" << endl;

}

main.cpp:

#include <stdlib.h>

#include "Line.h"

using namespace std;

int main(void)

{

Line line1(1, 2, 3, 4);

line1.printInfo();//调用的是不带const的printInfo()

const Line line2(5, 6, 7, 8);

line2.printInfo();//调用的是带const的printInfo()

system("pause");

return 0;

}

//即常对象和常对象成员只能调用常成员函数

//而普通的对象和对象成员却可以调用普通成员函数和常成员函数

//

//常数据成员和常对象成员必须使用初始化列表初始化

//(即const修饰的数据成员和对象成员在构造函数中只能用初始化列表初始化)

//同名的普通成员函数和常成员函数互为重载

运行一览:

【made by siwuxie095】

转载于:https://www.cnblogs.com/siwuxie095/p/6798391.html

常对象成员和常成员函数相关推荐

  1. 常对象只能调用常函数成员 c++

    关于 常对象只能调用常函数成员,不能调用非const 函数成员问题,我有点想法 就是我想到的一个角度来解释为什么. 你看,常函数成员的特性就是要在函数后面加一个const 修饰关键字 以  int g ...

  2. 常对象、常数据成员、常成员函数

    C++有不少措施保护数据的安全性,如private保护类的数据成员等. 但对于一些共用的数据,如函数实参与形参等,我们可以在不同的场合通过不同的途径访问同一个数据对象.有时不经意的误操作会改变数据的值 ...

  3. 【C++】 常对象、常数据成员、常成员函数总结

    常数据成员  ◆ 常数据成员必须进行初始化,并且不能被更新.  ◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化:普通数据成员在初始化列表和函数体中 ...

  4. 常对象、常数据成员、常成员函数总结

    # include <iostream> using namespace std;class Time {public:Time(int h = 10, int m = 30, int s ...

  5. C++中的常引用、常对象、常函数、常数据成员

    1.常引用 用const声明的引用就是常引用.常引用所引用的对象不能被更改.经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改.常引用的声明形式为:const 类型说明符 &引用名. ...

  6. c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象

    目录 4.3 C++对象模型和this指针 4.3.1 成员变量和成员函数分开存储 4.3.2 this指针概念(非常重要) 4.3.3 空指针访问成员函数 4.3.4 const修饰成员函数 相关教 ...

  7. C++常成员函数 常对象成员

    什么是常对象成员,什么是常成员函数? 首先先看一段代码: class A { private:const int a; // 常对象成员,只能在初始化列表赋值public:// 构造函数A() { } ...

  8. 常对象与常函数(Const修饰的对象与成员函数)

    常函数: 其定义与注意事项如下:     1.成员函数后加const后,我们称这个函数为常函数     2.常函数内不可修改成员属性     3.成员属性声明时加关键字mutable后,在常函数中依然 ...

  9. C++中常对象与常成员函数以及this与成员函数的联系与区别

    class A { }; /* 小记:对于const声明的对象,针对哪个变哪个不变得问题,实际上就是const后的整体不变 e.g.: const int *A; 或 int const *A; / ...

  10. C++之常引用对象只能调用常成员函数、重载为成员函数和友元函数的区别

    近日写了一道题,遇到了新bug,使博主对C++的逻辑严密性有了更深的体会,特写此博客.本文标题是对两个bug的总结,即本文内容分为两部分. 题目如下: 设计一个CShape抽象类,类中包含纯虚函数   ...

最新文章

  1. Linux创建指定用户特定指定目录权限
  2. pyspark-mongo-input-output
  3. 新思科技Chekib:AI芯片架构创新面临四大挑战
  4. JMS ActiveMQ研究文档
  5. LeetCode Range Sum Query 2D - Immutable
  6. 专访阿里云MVP王俊杰:开发者的超能力是用技术让世界更美好
  7. MyEclipse 中自动安插作者、注释日期等快捷键方法
  8. CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
  9. KindEditor富文本编辑器上传功能PHP语言报错问题
  10. CAN总线技术 | 数据链路层04 - CAN节点状态与错误处理机制
  11. SVM分类器(matlab)
  12. unity打开excel表格_Excel电子表格需要双击两次才能打开问题的解决方案
  13. JS 在火狐浏览器下关闭弹窗
  14. 解决Ubuntu18.04和Win10双系统系统时间不对的问题
  15. 提现微信和提现到支付宝
  16. 为什么小孩会沉迷游戏?小孩沉迷游戏中不想上学怎么办
  17. BZOJ2900 好玩的数字游戏
  18. ng alain的简单使用
  19. Android Studio 生成二维码、生成带logo的二维码
  20. 使用rapidxml 生成xml文件

热门文章

  1. matlab转向梯形优化设计,转向梯形优化设计matlab程序.doc
  2. framework dyld: Symbol not found: _OBJC_CLASS_xxx
  3. java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制
  4. 浅谈C/C++中的typedef和#define
  5. LeetCode每日一题 52. N皇后 II
  6. C++ vector容器删除操作
  7. 8086_显存相关知识
  8. 带表头节点单链表及其基本应用
  9. [BUUCTF-pwn]——cmcc_pwnme1
  10. 回溯法——旅行售货员问题