-
-
[分享]C++基础九-类的成员
-
发表于: 2021-8-30 17:25 4142
-
类可以看做是一种数据类型,这种数据类型是一个包含成员变量和成员函数的集合。
1、成员变量大都以m开头,这是约定成俗的写法,不是语法规定的内容。以m开头既可以一眼看出这是成员变量,又可以和成员函数中的形参名字区分开来。
2、类中的成员变量m_nID 被设置成private 属性,是私有的,在类的外部不能通过对象访问。成员函数GetID()和SetID()被设置为public 属性,是公有的,可以通过对象访问。
3、因为m_nID 成员变量是私有的,不能通过对象直接访问,所以必须借助 public 属性的成员函数GetID()和SetID()来修改它们的值。
4、类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型,本身不占用内存空间。
5、C++11标准之后,开始允许在类中对非静态成员变量进行初始化操作,可以使用等号或者大括号版本的初始化,但不能使用圆括号版本的初始化,如果构造函数在成员初始化列表中提供了相应的值,这些默认值将被覆盖。
1、类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。
2、在类体中直接定义函数时,不需要在函数名前加上类名;当成员函数定义在类体外时,必须在函数名前面加上类名予以限定。::被称为作用域运算符,用来连接类名和函数名,指明当前函数属于哪个类。
3、成员函数必须先在类体中声明,然后在类体外定义,也就是说类体的位置应该在函数定义之前。
4、在类体中和类体外定义成员函数的区别:在类体中定义的成员函数会自动成为内联函数,在类体外定义的不会。建议在类体内对成员函数作声明,在类体外进行定义。
5、类的声明和成员函数的定义都是类定义的一部分,在实际开发中,通常将类的声明放在头文件中,而将成员函数的定义放在源文件中。
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。
声明为private 的成员和声明为 public 的成员的次序任意,既可以先出现private 部分,也可以先出现public 部分。private 后面的成员都是私有的,直到有public 出现才会变成公有的;public 后面的成员都是公有的,直到有private 出现才会变成私有的。如果既不写private 也不写 public,就默认为 private。
private 关键字的作用在于更好地隐藏类的内部实现,不希望外部知道、或者只在类内部使用的、或者对外部没有影响的成员,都建议声明为private。如果将成员变量都声明为private,如何取值赋值呢?我们可以额外添加两个public 属性的成员函数,一个用来设置成员变量的值,一个用来获取成员变量的值。
给成员变量赋值的函数通常称为set 函数,它们的名字通常以set开头,后面跟着成员变量的名字;读取成员变量的值的函数通常称为get 函数,它们的名字通常以get开头,后面跟着成员变量的名字。
这种将成员变量声明为private、将相应的成员函数声明为public 的做法体现了类的封装性。所谓封装,指的是尽量隐藏类的内部实现,只向用户提供有用的成员函数。
#include <iostream>
using namespace std;
class
CStudent
{
public:
CStudent();
~CStudent();
void ShowInfo();
int
GetID();
void SetID(
int
nID);
private:
int
m_nID
=
0
;
public:
char m_szName[
128
]
=
{
0
};
double m_nScore
=
0
;
};
CStudent::CStudent()
{
cout <<
"CStudent"
<< endl;
}
CStudent::~CStudent()
{
cout <<
"~CStudent"
<< endl;
}
void CStudent::ShowInfo()
{
cout <<
"ID="
<< m_nID << endl;
cout <<
"Name="
<< m_szName << endl;
cout <<
"Score="
<< m_nScore << endl;
}
int
CStudent::GetID()
{
return
m_nID;
}
void CStudent::SetID(
int
nID)
{
m_nID
=
nID;
}
int
main()
{
CStudent Student;
/
/
Student.m_nID
=
99
;
/
/
不行
Student.SetID(
99
);
/
/
正确
/
/
cout <<
"getID="
<< Student.m_nID << endl;
/
/
不行
cout <<
"getID="
<< Student.GetID() << endl;
/
/
正确
Student.m_nScore
=
9
;
strcpy(Student.m_szName,
"xiaoxin"
);
Student.ShowInfo();
return
0
;
}
#include <iostream>
using namespace std;
class
CStudent
{
public:
CStudent();
~CStudent();
void ShowInfo();
int
GetID();
void SetID(
int
nID);
private:
int
m_nID
=
0
;
public:
char m_szName[
128
]
=
{
0
};
double m_nScore
=
0
;
};
CStudent::CStudent()
{
cout <<
"CStudent"
<< endl;
}
CStudent::~CStudent()
{
cout <<
"~CStudent"
<< endl;
}
赞赏
- [分享]C++基础十七-异常机制 8576
- [分享]C++基础十六-模板 8939
- [分享]C++基础十五-运算符重载 8962
- [分享]C++基础十四-抽象类 8675
- [分享]C++基础十三-多态 8475