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》笔记九 const形参小结

首先,形参大致可以分为三种:非引用形参、引用形参和指针类型形参。 一、非引用形参 在传递参数的时候,不论是所谓的传值还是传址,实际上都是实参值到形参值的复制,其中的区别只是复制的是普通对象...

c++primer学习笔记(3)-Compound Types(pointers and references) and const Qualifier.

1. The concept of Compound Types: A compound type is a type that is defined in terms of another typ...

重温C++ primer 之const总结

1.const变量,即常变量(变量值保持不变,不能被修改) a.const变量默认时是定义该变量的文件的局部变量 b.非const*指针无法指向const 变量,只有const *指针能指向c...

C++ primer 七 const形参和实参

当形参是const时,必须要注意关于顶层const的。顶层const作用于对象本身: const int ci =42;                   //不能改变ci, const是顶层的 ...

《C++ Primer》读书笔记-第二章 05 const限定符

作者:马志峰 链接:https://zhuanlan.zhihu.com/p/23406123 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 声明: ...

c++ primer(第五版)笔记 第二章(4)const, decltype, auto

#ifndef LESSON_2_4_H #define LESSON_2_4_H #include extern const int ciExt; inline void prin...

C++ Primer Plus学习笔记之const修饰指针

《C++ Primer Plus》学习笔记之const修饰指针 首先来谈一下const与define的区别,大家都知道两者都可以定义常量,但是define有一个明显的缺陷:没有类型信息; 例如: #...

const限定符及复合类型-《C++ primer》

C++中类型可以分为三种 一,内置类型 内置类型是最基本的类型,如int,float,double等。 二,复合类型 复合类型是指基于其他类型定义的类型。C++语言有引用,指针,数组等。   引用通俗...

《C++ primer》英文第五版阅读笔记(五)——const

const 限定词 被const修饰的变量的值不能被改变。 被const修饰的变量必须在定义时进行初始化。 const要放在类型名前面。 初始化 const对象能够做大多数nonconst对象...

c++primer笔记--2.4const限定符

1 const对象一旦创建后其值就不能再改变,所以const对象必须初始化。 2 默认状态下,const对象仅在文件内有效。 3 编译器将在编译过程中把用到const变量的地方都替换成对应的值。(有点...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ primer 类 const
举报原因:
原因补充:

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