c++ primer 类 const

原创 2016年05月31日 20:51:55

写个小程序来学习在类中有关const的用法。

1.const_stdy.h

#ifndef _CONST_STDY_H_
#define _CONST_STDY_H_

#include <string>
using namespace std;

class Account{
public:
	Account(string name = "xiaomi" , double rat = 0);	//const修饰成员变量只能在初始化列表中赋值
	
	const double get_rate();						//测试非const成员函数返回const成员变量
	const double get_rate() const;					//测试非const成员函数返回const成员变量

	void set_rate(const double &rat);				//测试非const成员函数修改const成员变量

	/*
		常成员函数, 它不改变对象的成员变量.                        
		也不能调用类中任何非const成员函数,可以调用非const成员变量
	*/
	string get_owner() const;						//测试const成员函数返回非const成员变量,
	void set_owner(string &str ) const;				//测试const成员函数修改非const成员变量

	const char *get_sex() const;
	void set_sex( const char *&se) const ;			//测试const成员函数修改const成员变量

private:
	string owner;
	const char *sex;
	double amount;
	const double rate;
};

#endif


2.const_stdy.cpp

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

Account::Account(string name /* = "xiaomi"  */, double rat):
owner(name),rate(rat),amount(0),sex("man"){

}

const double Account::get_rate(){
	cout<<"in non-const fun."<<endl;
	return rate;
}

/************************************************************************/
/* 为了const 对象准备的,const对象/指针/引用  只能调用类的const成员函数,

因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。                                                                   */
/************************************************************************/
const double Account::get_rate() const{
	cout<<"in const fun."<<endl;
	return rate;
}

void Account::set_rate(const double &rat){
	//rate = rat;				//编译错误error C2166: 左值指定 const 对象
}

/*前面不加const,error1:  “return”: 无法从“const char *const ”转换为“char *”*/
const char *Account::get_sex() const{
	return sex;
}

string Account::get_owner() const {	
	return owner;				//编译运行通过,说明const成员函数可以调用非const成员变量
}

void Account::set_sex(const char *&se) const{
	//sex = se;				//编译错误,其实改变的不是sex指向的值,而是sex指针本身,如果没有const 
							//编译通过
}

void Account::set_owner(string &str ) const{
	//owner = str;			//编译错误, 说明const成员函数不能修改非const成员变量
	//get_rate();				// error C2662: “Account::get_rate”: 不能将“this”指针从“const Account”转换为“Account &”
}


3.main.cpp

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

int main(int argc, char **argv){
	Account acc;
	Account *new_acc ;
	const Account *con_acc ;

	/* 类的普通对象,非const对象可以调用const函数*/
	cout<<acc.get_rate()<<'\t'<<acc.get_owner()<<'\t'
		<<acc.get_sex()<<endl;

	acc.set_rate(1.2);

	/* 类的指针对象 */
	new_acc = new Account();

	cout<<new_acc->get_rate()<<'\t'<<new_acc->get_owner()<<'\t'
		<<new_acc->get_sex()<<endl;

	/* 类的const指针对象 */
	con_acc = new Account();

	/************************************************************************/
	/*  const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。
		对于对象指针和对象引用也是一样。

		const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任
		何非const成员函数会有修改成员变量的企图。                                                                     */
	/************************************************************************/

	/*error C2662: “Account::get_rate”: 不能将“this”指针从“const Account”转换为“Account &”*/
	cout<<con_acc->get_rate()<<'\t'<<con_acc->get_owner()<<'\t'
		<<con_acc->get_sex()<<endl;

	system( "pause" );
	return 0;
}

小结:

1.我们首先看类的对象:const对象和非const对象。

a.如果是非const对象,由上面的实验可以看出:const对象可以访问非const成员函数,const成员函数

b.若是const对象:.只能访问const成员函数, 不能访问非成员函数。

2.然后再看成员函数:

a.非const成员函数可以访问非const数据成员、const数据成员, const成员函数 ,非const成员函数 。但不能修改const数据成员 , 可以修改非修改const数据成员。

b.const成员函数可以访问非const数据成员、const数据成员 ,const成员函数,不能访问非const成员函数 。不能修改const数据成员和非const数据成员,。

3.作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

另外有两篇文章说的比较好:

http://blog.csdn.net/eric_jo/article/details/4138548 和 http://www.cnblogs.com/jiabei521/p/3335676.html


版权声明:本文为博主原创文章,未经博主允许不得转载。

c++ primer 第五版的Sales_data类

这个书店程序在c++ primer第五版中可是贯穿了大概两百页(我才看到二百多页)啊,终于看完了。看着书上的代码,终于的写完了Sales_data类,毕竟初学,很多地方不熟悉,写的和书上有些差距,有些...
  • gyhguoge01234
  • gyhguoge01234
  • 2016年03月04日 22:22
  • 598

C++Primer第五版 7.4节练习

练习7.33:如果我们给Screen添加一个如下所示的size成员将发生什么情况?如果出现了问题,请尝试修改它。 pos Screen::size() const { return he...
  • fengzhanghao23
  • fengzhanghao23
  • 2015年09月16日 07:20
  • 663

C++Primer学习之二#define,const,constexpr

一.#define 是预处理操作符(宏定义),编译器将在编译过程中用到该变量的地方替换成对应的值。 二.Const const是声明常量的限定符,它可以约定一个变量为常量。 如: Cons...
  • Jammg
  • Jammg
  • 2016年01月30日 21:15
  • 509

C++Primer第五版 12.1.1节练习

练习12.1:在此代码的结尾,b1和b2各包含多少个元素?StrBlob b1; { StrBlob b2 = {"a","an","the"}; b1 = b2; b2.push_back("abo...
  • fengzhanghao23
  • fengzhanghao23
  • 2015年10月28日 14:38
  • 1041

C++ Primer中文本查询示例Query的实现

最近在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询示例时,觉得设计得非常不错,于是便动手照着实现了一个,修改了很久终于运行成功了,从中也学习到了很多的语法。下面把实现与总结分...
  • zhaoxy2850
  • zhaoxy2850
  • 2014年07月20日 19:12
  • 2216

14.6 && 14.7节练习

练习14.27 为你的StrBlobPtr类添加递增和递减运算符。 StrBlobPtr& StrBlobPtr::operator++() { check(curr, "increment pas...
  • Pierce_Liu
  • Pierce_Liu
  • 2016年06月20日 22:48
  • 216

C++类const成员变量初始化

class CExample { public: CExample():m_a(1),m_b(2){/*m_a = 1; compile error*/} CExample(const CExam...
  • junlon2006
  • junlon2006
  • 2016年11月08日 16:37
  • 1603

《C++ Primer》读书笔记——第六章

6.1.1 在c++中,名字有作用域,对象有生命周期。 局部变量尽在函数的作用域内可见,同时会隐藏外层作用域中同名的其他所有声明。 在所有函数体制外定义的对象存在于程序的整个执行过程中。此类对象在启动...
  • u011389977
  • u011389977
  • 2016年09月11日 10:25
  • 262

C++ Const详解,包含类对象的类

1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误) 2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,     任意修改它所在的类的成员的操作...
  • u013426958
  • u013426958
  • 2015年06月11日 19:52
  • 842

《C++primer(第五版)》学习之路-第七章:类

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】   7.1 定义抽象数据类型   1.类的基本思想是数据抽象和封装,数据抽...
  • libin1105
  • libin1105
  • 2015年09月22日 23:01
  • 2188
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ primer 类 const
举报原因:
原因补充:

(最多只允许输入30个字)