首页
社区
课程
招聘
[分享]C++基础九-类的成员
发表于: 2021-8-30 17:25 4142

[分享]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;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//