C++:常对象成员和常成员函数_c 普通对象可以创建常成员函数吗_卡卡fantic的博客-程序员秘密

技术标签: C++  c++  

5-1 常对象成员和常成员函数

常成员函数:如果一个成员函数对类中数据成员只作访问而不作直接或间接的修改,则最好将此函数设置为常成员函数,以明确表示它对数据成员的保护性。
常对象:必须进行初始化,常对象只能调用常成员函数。

例子:
在这里插入图片描述
在这里插入图片描述


常对象成员:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


常成员函数:
在这里插入图片描述
在这里插入图片描述
上图:常成员函数中为什么不能改变数据成员的值
在这里插入图片描述
在这里插入图片描述
上图:编译后this指针是用const指针修饰的,成了一个常指针,通过常指针改变指针指向的数据是不被允许的


在这里插入图片描述
上图中:互为重载,但不推荐这样使用;
在这里插入图片描述
上图:调用的是不带const的函数;
在这里插入图片描述


5-2 常对象成员和常成员函数实践

在这里插入图片描述
Coordinate.h

#include<iostream>
using namespace std;

class Coordiante
{
    
public:
	Coordiante(int x,int y);
	~Coordiante();
	void setX(int _x);//第一个参数(this指针)不加也行(默认的),之所以报错的原因是m_coora只读,而this指针可读可写
	void setY(int _y);
	int getX() const;//m_coora只读,而this指针可读可写,所以加const修饰就只读了
	int getY() const;//const修饰之后成为常成员函数;set函数不能加const
private:
	int m_iX;//只有类里的成员函数才能访问private的成员?
	int m_iY;
};

Coordinate.cpp

#include<iostream>
#include "Coordinate.h"
using namespace std;

Coordiante::Coordiante(int x,int y):m_iX(x),m_iY(y)//可以用初始化列表也可以不用;
{
    
	//m_iX=x;
	//m_iY=y;
	cout<<"Coordiante()"<<m_iX<<","<<m_iY<<endl;
}

Coordiante::~Coordiante()
{
    
	cout<<"~Coordiante()"<<m_iX<<","<<m_iY<<endl;
}

void Coordiante::setX(int _x)
{
    
	m_iX = _x;
}

int Coordiante::getX() const
{
    
	return m_iX;
}

void Coordiante::setY(int _y)
{
    
	m_iY = _y;
}

int Coordiante::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);
	void printInfo();
	void printInfo() const;
private:
	const Coordiante m_coorA;//等价于Coordiante const m_coorA;
	Coordiante 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(x);
	//m_coorA.setY(y);
}
void Line::setB(int x,int y)
{
    
	m_coorB.setX(x);
	m_coorB.setY(y);
}
void Line::printInfo()
{
    
	cout<<"printInfo()"<<endl;
	cout<<m_coorA.getX()<<","<<m_coorA.getY()<<endl;
	cout<<m_coorB.getX()<<","<<m_coorB.getY()<<endl;
}

void Line::printInfo() const
{
    
	cout<<"printInfo()const"<<endl;
	cout<<m_coorA.getX()<<","<<m_coorA.getY()<<endl;
	cout<<m_coorB.getX()<<","<<m_coorB.getY()<<endl;
}

demo.cpp

#include<iostream>
#include<stdlib.h>
//#include "Coordinate.h"//如果加了会出错:“class”类型重定义,只加line.h就行了(line.h已经引用了Coordinate.h)
#include "Line.h"
using namespace std;

int main(void)
{
    
	Line l1(1,2,3,4);
	l1.printInfo();

	const Line l2(5,6,7,8);
	l2.printInfo();
	system("pause");
	return 0;
}

运行结果

Coordiante()1,2
Coordiante()3,4
Line()
printInfo()
1,2
3,4
Coordiante()5,6
Coordiante()7,8
Line()
printInfo()const
5,6
7,8
请按任意键继续. . .

5-4 常指针与常引用

例子:
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
上图:常引用和常指针只有读权限,而getx()里的参数this是读写权限的,所以会出现错误,只能访问同样是常成员函数的printInfo;


在这里插入图片描述
上图:const在中间,指针不能指向其他对象,但指针指向对象的内容能变;说明此时是读写权限的指针,指向的对象可以读写,但不能指向其他位置;

pCoor->printInfo();指针是可读可写的,函数是可读的,所以可以(?)

5-5 练习题

List item
普通对象可以调用常对象成员函数,常对象只能调用常成员函数;

5-6 单元巩固

定义一个坐标类,在栈上实例化坐标类常对象,并给出坐标(3,5),然后定义常引用、常指针,最后使用对象、引用、指针分别通过调用信息打印函数打印坐标信息。

#include <iostream>
using namespace std;
class Coordinate
{
    
    
public:
	Coordinate(int x, int y)
	{
    
		// 设置X,Y的坐标
		m_iX=x;
        m_iY=y;
	}
    // 实现常成员函数
	void printInfo() const
	{
    
	    cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
	}
public:
	int m_iX;
	int m_iY;
};


int main(void)
{
    
	const Coordinate coor(3, 5);

	// 创建常指针p
	const Coordinate *p= &coor;
    // 创建常引用c
    const Coordinate &c=coor;
	
	coor.printInfo();
	p->printInfo();
	c.printInfo();  
	
	return 0;
}

运行结果

(3,5)
(3,5)
(3,5)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42745340/article/details/104615988

智能推荐

ssm面试题总结 spring springmvc面试题 理解spring_25个spring面试题_wu1317581750的博客-程序员秘密

1.你如何理解Spring?具体来说Spring是一个轻量级的容器,用于管理业务相关对象的。核心功能主要为:IOC,AOP,MVC。IOD:控制反转,将对象的创建过程交给容器,让容器管理对象的生命周期如创建,初始化,销毁等。AOP:面向切面编程,对关注点进行模块化,通过对某一功能点进行编程,比如记录日志,有很多个类都需要记录日志的方法,则创建记录日志的代理方法,需要调用该功能是只需要调...

Linux 爆新漏洞,长按回车 70 秒可获得 root 权限_weixin_34124577的博客-程序员秘密

按住回车70秒,黑客就能在linux系统绕过认证,进而获取root权限,并能远程控制经过加密的linux系统。漏洞来源这个安全问题来源于Cryptsetup存在的一个漏洞(CVE-2016-4484)。Cryptsetup是在Linux统一密钥设置(Linux Unified Key Setup, LUKS)中用来加密磁盘的软件,而LUKS则是Lin...

白娘子传奇服务端linux,[转载]戏说《新白娘子传奇》中的法海,到底是好还是坏?..._老凯撒的钱的博客-程序员秘密

戏说&lt;&gt;中的法海,到底是好还是坏?Is Fahai in “The Legend of the White Snake” good or bad?相信,地球人都知道&lt;&gt;,里面的白娘子虽然是一条蛇妖,但她却是一条比人好上千百倍的,有时连人都不如蛇的好妖精. 她漂亮温柔, 善良娴熟, 有勇有谋…对爱情执着,对友情坚固,对亲情有恩有惠…It is known to all tha...

Pandas之read_excel()和to_excel()函数解析_weixin_30575309的博客-程序员秘密

read_excel()加载函数为read_excel(),其具体参数如下。read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None,names=None, parse_cols=None, parse_dates=False,date_parser=None,na_value...

C++ 学习笔记 开篇_argentina1111的博客-程序员秘密

  从大一开始学习C语言,大学期间做了许多嵌入式的开发项目,毕业后从事嵌入式开发工作主要的开发语言也是C语言。虽然期间断断续续的学习过C++,做过QT、C#上位机但也只是在其他语言的外壳下使用C在开发,始终没有好好的学习C++,一遇到C++就犯怂,看着代码似懂非懂的感觉。  秉承着“不会C++的程序猿不是合格的猴子”的信念(自己瞎掰),趁着目前有空闲的时间下定决心好好的学习C+...

codeforces 499A watching a movie_watching a moviecsdn_baker00的博客-程序员秘密

A. Watching a movietime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou have decided to watch the best momen

随便推点

第六周编程题_GPS数据处理_温柔小猪的博客-程序员秘密

NMEA-0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导

时间触发嵌入式系统设计模式 第14章 笔记_wowocpp的博客-程序员秘密

1 函数指针 代码:/*------------------------------------------------------------------*- Main.C (v1.00) ------------------------------------------------------------------ 函数指针的演示-*-----------...

微信小程序获取用户信息并存入数据库_wx.request把数据保存在数据库中_Abel_JiaWei的博客-程序员秘密

微信小程序获取用户信息,如果仅是需要用户头像和用户微信昵称,那就直接下面这两行代码无需授权直接获取&lt;!-- 如果只是展示用户头像昵称,可以使用 &lt;open-data /&gt; 组件 --&gt;&lt;open-data type="userAvatarUrl"&gt;&lt;/open-data&gt;&lt;open-data type="userNickName"&gt;...

如何将TS格式的视频转换成mp4格式_ts文件转换mp4_视频格式转换器的博客-程序员秘密

最近发现视频格式有好多种,其中TS视频也是其中的一种,这些视频没有特定的播放器是无法播放的,如果没有安装相应的播放器,那么就比较麻烦,但是今天小编介绍一款ts视频格式转换成MP4的工具,让你摆脱这个困难。TS是日本高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。那么又是如何将ts转换mp4格式的呢?1、首先打开迅捷视频转换器,然后点击软件左上角的添加文件或者点击添加文件夹按钮,然...

基于Quick-cocos2d-x的资源更新方案 一_weixin_30952535的博客-程序员秘密

图片来自网络思绪何来昨天写了一篇关于更新方案的理论游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游)今天继续细化一下由于新项目采用的是Quick-cocos2d-x,那我就直接给出我基于Quick-cocos2d-x-master( &gt; 2.2.3 rc) 的更新方案吧此更新方案要解决以下几个问题一、资源、代码在线更新二、frame...