C++语言中常对象、常对象成员【详细讲解】

1、常对象

1)常对象:指的是对象常量。

2)格式

类名 const 对象名;
or
const 类名 对象名;

3)常对象使用时注意要点

(1)在定义常对象时必须进行初始化;
(2)常对象的成员属性不能进行更新;
(3)常对象不能调用该对象中非常成员函数【非const函数】,否则系统会报错误。目的:防止非const成员函数修改常对象中的成员属性的值,因为const成员函数是不可以修改对象中成员属性的值。
(4)常对象的主要作用是【防止对常对象的成员属性的值进行修改】

对注意点(1)(2)的解释

程序1:

#include <iostream>
#include <string>

using namespace std;

class Person{
public:
	Person()
	{
		cout << "调用了Person()构造函数!!!" << endl;
	}
	Person(int age)
	{
		cout << "调用了Person(int age)构造函数!!!" << endl;
		Age = age;
	}
	~Person()
	{
		cout << "调用了析构函数!!!" << endl;
	}
	int Age;
};

int main()
{
	const Person a(10);  //定义个常对象,并且对其中的成员属性进行初始化
	cout << "a.Age的值为:" << a.Age << endl;
	return 0;
}

运行结果:

调用了Person(int age)构造函数!!!
a.Age的值为:10
调用了析构函数!!!

程序2:

#i1nclude <iostream>
#include <string>

using namespace std;

class Person{
public:
	Person()
	{
		cout << "调用了Person()构造函数!!!" << endl;
	}
	Person(int age)
	{
		cout << "调用了Person(int age)构造函数!!!" << endl;
		Age = age;
	}
	~Person()
	{
		cout << "调用了析构函数!!!" << endl;
	}
	int Age;
};

int main()
{
	const Person a;  //定义个常对象
	a.Age = 10;      //不能对常对象中的成员属性的值进行修改
	return 0;
}

运行结果:

结果解释:

将常对象类比于常整型进行记忆学习。比如,在下面的语句中,将a定义为一个整型常量,只能并且必须在初始化的时候对a赋初值,之后不可以对a的值进行改动。

const int a = 10;    //将a定义一个整型常量,并且对a进行初始化
a = 20;              //错误,a是整型常量,不能对a的值进行再次修改

对注意点(3)的解释

程序:

#include <iostream>
#include <string>

using namespace std;

class Person{
public:
	Person()
	{
		cout << "调用了Person()构造函数!!!" << endl;
	}
	Person(int age)
	{
		cout << "调用了Person(int age)构造函数!!!" << endl;
		Age = age;
	}
	//非const成员函数
	void fun(void)
	{
		cout << "调用非const函数fun(void)" << endl;
	}
	~Person()
	{
		cout << "调用了析构函数!!!" << endl;
	}
	int Age;
};

int main()
{
	const Person a;  //定义个常对象
	a.fun();         //常对象不能调用类中非const成员函数
	return 0;
}

运行结果:

2、常对象成员

常对象成员包括常成员属性常成员函数

1)常成员属性

(1)类中的成员属性可以是常量或者常引用,使用const关键字将成员属性变换为常成员属性。

(2)如何对于常成员属性进行初始化?

答:通过构造函数和初始化列表对于常成员属性进行初始化。

类名(参数列表):常成员属性1(值),常成员属性2(值),......

(3)程序

#include <iostream>

using namespace std;
class Person {
public:
	Person(int a, int b,int c) :Age(a), Data(b), Num(c)  //通过初始化列表来初始化常成员属性
	{
		cout << "调用了构造函数和初始化列表来初始化常成员属性!!!" << endl;
	}
	const int Age;   //常量
	const int Data;
	const int& Num;  //常引用
};

int main()
{
	int c = 30;
	Person person(10, 20,c);
	cout << "person.Age的值为:" << person.Age << endl;
	cout << "person.Data的值为:" << person.Data << endl;
	cout << "person.Num的值为:" << person.Num << endl;
	return 0;
}

运行结果:

调用了构造函数和初始化列表来初始化常成员属性!!!
person.Age的值为:10
person.Data的值为:20
person.Num的值为:30

知识回顾:

带有初始化列表的构造函数执行顺序:先执行初始化列表,在执行构造函数体。对于含有多个初始化项的列表,初始化顺序是按照成员属性定义的顺序进行初始化的。

 2)常成员函数【之前学的都是非常成员函数】

(1)格式

函数类型 函数名称(参数列表) const

(2)对于常成员函数的注意要点

a. 常成员函数不能更新对象的成员属性;
b. 常成员函数不能调用该类中其他的非常成员函数;
c. 常对象只能调用常成员函数,不能调用非常成员函数;
d. const关键字可以实现函数重载。

(3)程序

#include <iostream>

using namespace std;
class Person {
public:
	//构造函数
	Person(int age) :Age(age)
	{
		cout << "调用了构造函数!!!" << endl;
	}
	//非常成员函数
	void fun(void)
	{
		cout << "调用了非常成员函数!!!" << endl;
	}
	//常成员函数
	void function(void) const
	{
		cout << "调用了常成员函数!!!" << endl;
		cout << "Age的值为:" << Age << endl;
	}
	int Age;
};

int main()
{
	const Person a(10);  //定义一个常对象
	a.function();        //常对象只能调用常成员函数
	cout << "-------------------" << endl;
	Person b(20);        //定义一个非常对象
	b.function();        //既可以调用常成员函数
	b.fun();             //也可以调用非常成员函数
	return 0;
}

运行结果:

调用了构造函数!!!
调用了常成员函数!!!
Age的值为:10
-------------------
调用了构造函数!!!
调用了常成员函数!!!
Age的值为:20
调用了非常成员函数!!!

3、常对象、常成员属性、常成员函数总结

1)常对象只能调用常成员函数,不能调用非常成员函数;并且成员属性只能通过构造函数和初始化列表进行初始化,之后不能被修改
2)常成员函数只能调用该类中常成员函数,不能调用该类中非常成员函数;可以访问成员属性,但是不能修改成员属性
3)常成员函数与非常成员函数可以实现重载
4)非常对象既可以调用非常成员函数也可以调用常成员函数(优先调用非常成员函数
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值