关闭

c++ primer 类 const

标签: c++ primerclassconst
55人阅读 评论(0) 收藏 举报
分类:

写个小程序来学习在类中有关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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:44746次
    • 积分:851
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:95篇
    • 译文:0篇
    • 评论:2条
    最新评论