c++类——常成员

本文最后更新于:1 年前

(一)概念:

类的常成员包括常数据成员,常成员函数,常对象。

下面每一部分分别介绍一个内容。

(二)常数据成员:

1. 概念:

常数据成员是指在类中定义的不能修改其值的一些数据成员(只读变量),与常变量类似,一经赋值就无法再次进行更改。

形式为:const 类型 数据成员名;

2. 特点:

  • 不同对象的相同常数据成员可以不同,但对于单个对象来说,常数据成员在初始化后是不可变的。

  • 初始化时只允许通过初始化列表进行初始化,不允许在构造函数体内进行初始化/赋值等改变左值的操作。

  • 对于任何函数,无论是成员函数、友元函数还是类外函数,均不允许修改其值,只能读取。

3. 代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
class Simple
{
private:
const int x;
int y;
public:
Simple():x(0)
{
x=0;//错误!不允许在构造函数体内初始化常数据成员x的值!
cout << "创建对象" << endl;
y = 0;
};
Simple (int a, int b) : x(a), y(b)
{
cout << "创建对象" << endl;
}
void showXY()
{
cout << x << "," << y << endl;
}
void resetXY(int a, int b)
{
x = a, y = b; //错误!不允许修改常数据成员x的值!
return ;
}
void Simple_thisuse(int a,int b)
{
cout << this->x << " " << this->y << endl;
(*this).x += a;//错误!不允许修改常数据成员x的值!
(*this).y += b;
cout << this->x << " " << this->y << endl;
cout << this << endl;
return;
}
~Simple()
{
cout << "释放对象" << endl;
}
};
int main()
{
Simple ss;
Simple s(1, 2);//在构造函数处对常数据成员赋值
ss.showXY();
return 0;
}

(三)常成员函数:

1. 概念:

用const修饰的成员函数即为常成员函数。实际上,const是在修饰该成员函数隐含的this指针。

const 类名 ***** const this

形式:返回类型 成员函数名(参数表) const { 成员函数体 }

要注意const在成员函数开头时表示的是返回值是const的,即返回值不可修改。

const必须加在成员函数头部的结尾

2. 特点:

  • 不更新对象的数据成员,但是都能够访问(读取)。

  • 不能在常成员函数中调用没有用const修饰的成员函数,只能调用常成员函数

  • 可以被其他不是常成员函数的成员函数调用。

  • const关键字可以用来区别成员函数的重载情况——通常非const成员函数也需要定义const版本的重载函数,用于常对象对该函数功能的调用。

  • 在类外写实现时const仍要保留

3. 代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;
class Simple
{
private:
int x;
int y;
public:
Simple():x(0),y(0)
{
cout << "创建对象" << endl;

};
Simple (int a, int b) : x(a), y(b)
{
cout << "创建对象" << endl;
}
void showXY()
{
cout << x << "," << y << endl;
}
void showXY() const //正确,不修改任意成员变量,可以加const
{
cout << x << "," << y << endl;
}
void resetXY(int a, int b)
{
x = a, y = b;
return ;
}
void resetXY(int a, int b) const //错误,修改了成员变量,不可以加const
{
x = a, y = b;
return;
}
const void Simple_thisuse(int a,int b) //const加入位置错误
{
cout << this->x << " " << this->y << endl;
(*this).x += a;
(*this).y += b;
cout << this->x << " " << this->y << endl;
cout << this << endl;
return;
}
~Simple()
{
cout << "释放对象" << endl;
}
};
int main()
{

Simple ss;
Simple s(1, 2);
ss.showXY();
return 0;
}

(四)常对象:

1. 概念:

在声明对象前加const称该对象为常对象。

形式:类名 const 对象名[(参数表)] / const 类名 对象名[(参数表)] 两种意义相同。

2. 特点:

  • 常对象只能调用常成员函数,不能调用非const成员函数。——常对象无法修改任何数据成员。

  • 常对象中的数据成员必须要有初值,一经确定将无法改变。

  • 常成员的成员函数/数据成员不一定是常成员函数/常数据成员,但表现为常成员函数/常数据成员。

3.代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;
class Simple
{
private:
int x;
int y;
public:
Simple():x(0),y(0)
{
cout << "创建对象" << endl;

};
Simple (int a, int b) : x(a), y(b)
{
cout << "创建对象" << endl;
}
void showXY()
{
cout << x << "," << y << endl;
}
void showXY() const //正确,不修改任意成员变量,可以加const
{
cout << "调用const版本:" << endl;
cout << x << "," << y << endl;
}
void resetXY(int a, int b)
{
x = a, y = b;
return ;
}

const void Simple_thisuse(int a,int b) //const加入位置错误
{
cout << this->x << " " << this->y << endl;
(*this).x += a;
(*this).y += b;
cout << this->x << " " << this->y << endl;
cout << this << endl;
return;
}
~Simple()
{
cout << "释放对象" << endl;
}
};
int main()
{
Simple ss;
Simple s(1, 2);
ss.showXY();
const Simple s1;
Simple const s2(2, 3);//两种都可以
s1.resetXY(1, 2);//不可以调用非常成员函数
s2.showXY();//调用const版本
return 0;
}

c++类——常成员
https://github.com/xiaohei07/xiaohei07.github.io/2023/03/17/c++类——常成员/
作者
07xiaohei
发布于
2023年3月17日
许可协议