<C++> 类和对象之封装,精准区分class与struct

简介: <C++> 类和对象之封装,精准区分class与struct

封装的意义


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


意义:


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

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


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

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


#include<iostream>
using 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_namem_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++ structclass唯一的区别就在于 默认的访问权限不同

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;
}

classstruct中都定义了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;
}


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


案例练习


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


参考代码:


#include<iostream>
using 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;
        }
}
相关文章
|
24天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
80 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
86 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
31 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
26 1
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
18 0
|
2月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)