千家信息网

C++类和对象之封装及class与struct的区别是什么

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容主要讲解"C++类和对象之封装及class与struct的区别是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++类和对象之封装及class
千家信息网最后更新 2025年01月16日C++类和对象之封装及class与struct的区别是什么

本篇内容主要讲解"C++类和对象之封装及class与struct的区别是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++类和对象之封装及class与struct的区别是什么"吧!

封装的意义

封装是C++三大面向对象之一

意义:

1、设计类的时候,属性和行为写在一起,表现事物

2、类在设计时,可以把属性和行为放在不同的权限下,加以控制

语法:class 类名 {访问权限:属性 / 行为};

示例1:设计一个直角三角形,并求解他的面积

#includeusing namespace std;//class代表设计一个类,后面跟着的是类名class taiAngle{public:  //访问权限  公共的权限        //属性    int m_a;//直角边a    int m_b;//直角边b        //行为        //获取三角形面积        double calculate()        {                return (m_a*m_b)/2;        }};int main() {         //通过三角形类,创建三角形的对象        // c1就是一个具体的三角形        taiAngle c1;        c1.m_a = 10; //给三角形两边进行赋值操作    c1.m_b = 10;        cout << "三角形的面积为: " << c1.calculate() << endl;//调用方法        system("pause");        return 0;}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,显示学生的姓名和学号

//学生类class Student {public:        void setName(string name) {                m_name = name;        }        void setID(int id) {                m_id = id;        }        void showStudent() {                cout << "name:" << m_name << " ID:" << m_id << endl;        }private:        string m_name;        int m_id;};int main() {        Student stu;        stu.setName("马可波罗");        stu.setID(250);        stu.showStudent();        system("pause");        return 0;}

在第二个案例中,姓名和学号是不会被直接访问的,主函数中我们创建了stu学生类对象,但是我们输入"stu."时不会出现m_name和m_id的提示,这就牵扯到了访问权限的知识点,处于私有权限的属性只能靠成员方法加以控制,继续往下看

访问权限

public 公共权限:

成员:类内可以访问,类外可以访问

任何一种继承,子类可以访问父类的公共成员

保护权限protected

成员:类内可以访问,类外不可以访问

任何一种继承,子类可以访问父类的保护成员

私有权限private

成员:类内可以访问,类外不可以访问。

任何一种继承,子类不可以访问父类的私有成员

示例:

class Person{        //姓名  公共权限public:        string m_Phone;        //手机  保护权限protected:        string m_Phone;        //银行卡密码  私有权限private:        int m_Password;public:        void display();};void Person::display(){        m_Name = "张三";        m_Phone = "华为";        m_Password = 123456;}int main() {        Person p;        p.m_Name = "李四";        //p.m_Phone = "iPhone 13";  //保护权限类外访问不到        //p.m_Password = 123;     //私有权限类外访问不到        system("pause");        return 0;}

这个案例中定义了三种权限的属性,只有punlic:权限下的属性和成员函数可以在类外被调用;这里的display方法我在public:权限下只是声明的一下,然后在类外完成方法的实现,但是需要在原来声明的基础上加"Person::"在返回值类型和函数名之间,以表示是Person这个类作用域下的display方法;main函数只可以调用display方法和修改m_Name属性,因为只有这两个在punlic:权限下了。

class和struct的区别

在C++中 struct和class唯一的区别就在于默认的访问权限不同

class 默认权限是私有

struct 默认权限是公共

示例:

class C1{        int  m_A; //默认是私有权限};struct C2{        int m_A;  //默认是公共权限};int main() {        C1 c1;        c1.m_A = 10; //错误,访问权限是私有        C2 c2;        c2.m_A = 10; //正确,访问权限是公共        system("pause");        return 0;}

class和struct中都定义了m_A属性,但是main函数中是无法修改类c1对象的m_A属性的

成员属性私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

示例:

class Person {public:        //姓名设置可读可写        void setName(string name) {                m_Name = name;        }        string getName()        {                return m_Name;        }         //获取年龄         int getAge() {                return m_Age;        }        //设置年龄        void setAge(int age) {                if (age < 0 || age > 150) {                        cout << "你个大乌龟!" << endl;                        return;                }                m_Age = age;        }        //情侣设置为只写        void setLover(string lover) {                m_Lover = lover;        }private:        string m_Name; //可读可写  姓名        int m_Age; //只读  年龄        string m_Lover; //只写  爱人};int main() {        Person p;        //姓名设置        p.setName("张三");        cout << "姓名: " << p.getName() << endl;        //年龄设置        p.setAge(50);        cout << "年龄: " << p.getAge() << endl;        //爱人设置        p.setLover("阿尼亚");        //cout << "爱人: " << p.m_Lover << endl;  //只写属性,不可以读取        system("pause");        return 0;}

当属性都设计成私有时,我们可以自己控制属性的读写权限,让程序更具有强壮性,通过写方法来读写属性,是不是很具有掌控性呢,接下来给出一个案例,加深理解。

案例练习

利用全局函数和成员方法两种方式判断两个立方体是否相等,要求利用类的知识,将属性设置为私有。

参考代码:

#includeusing namespace std;//案例1 判断两个立方体是否相等class Cube{public:        void setL(int l)        {                m_L = l;        }        int getL()        {                return m_L;        }        void setW(int w)        {                m_W = w;        }        int getW()        {                return m_W;        }        void setH(int h)        {                m_H = h;        }        int getH()        {                return m_H;        }        int Area(int a, int b, int c)        {                return 2 * (a * b + a * c + b * c);        }        int 体积(int a, int b, int c)        {                return a * b * c;        }        bool isSameByClass(Cube& x)        {                if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W)                {                        return true;                }                else {                        return false;                }        }private:        int m_L;        int m_W;        int m_H;};//利用全局函数判断,两个立方体是否相等bool isSame(Cube& c1, Cube& c2){        if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())        {                return true;        }        else        {                return false;        }}int main(){        Cube c1;        c1.setH(10);        c1.setL(10);        c1.setW(10);        Cube c2;        c2.setH(10);        c2.setL(10);        c2.setW(10);        cout << "面积为:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl;        cout << "体积为:" << c1.体积(c1.getH(), c1.getH(), c1.getL()) << endl;        //利用成员函数判断立方体        if (c1.isSameByClass(c2))        {                cout << "两个立方体相等" << endl;        }        else {                cout << "两个立方体不相等" << endl;        }        //利用全局函数判断        bool ret = isSame(c1, c2);        if (ret)        {                cout << "两个立方体相等" << endl;        }        else {                cout << "两个立方体不相等" << endl;        }}

到此,相信大家对"C++类和对象之封装及class与struct的区别是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0