一、初识面向对象

一、C与C++在结构体中的封装

1.1 C语言结构体的封装

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
struct Person
{
    char name[64];
    int age;
};

void PersonEat(struct Person *p)
{
    printf("%s在吃饭\n", p->name);
}


void test01()
{
    struct Person p1;
    strcpy(p1.name, "wangyong");
    p1.age = 27;
    PersonEat(&p1);  // wangyong在吃饭

}


struct Dog
{
    char name[64];
    int age;
};

void DogEat(struct Dog *dog)
{
    printf("%s正在吃狗粮\n", dog->name);
}

void test02()
{
    struct Dog dog;
    strcpy(dog.name, "旺财");  
    DogEat(&dog);// 旺财正在吃狗粮

    struct Person p1;
    strcpy(p1.name, "xxx");
    DogEat(&p1); // xxx正在吃狗粮

    // 因为 C 中没有严格的封装, 属性和行为是分开的。 xxx这个是一个人的结构体,但是也可以如上调用了 狗 的结构体的方法,所以C的封装类型处理不够
}

int main()
{
    test01();
    test02();
    return 0;
}

1.2 C++结构体的封装

C++ 的封装有严格类型转换检测, 让属性和行为绑定在一起
1. 属性和行为作为一个整体来表示生活中的事务
2. 结构体与类中都有控制权限 public 公有权限 protected 保护权限 private 私有权限。 如果不说明, 类默认权限是 private, struct 的默认权限是 public。 所谓私有权限,就是私有成员在类内部可以访问, 类外就不可以访问

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<string>
using namespace std;

struct Person
{
    char name[64];
    int age;

    void PersonEat()  // C++结构体可以放函数
    {
        cout << name << "正在吃饭" << endl;
    }

};


struct Dog
{
    char name[64];
    int age;

    void DogEat()  // C++结构体可以放函数
    {
        cout << name << "正在吃狗粮" << endl;
    }

};

void test01()
{
    Person p1;
    strcpy(p1.name, "王勇");
    p1.PersonEat();  // 王勇正在吃饭
}


int main()
{
    test01();
    return EXIT_SUCCESS;
}

 

 

二、类的封装

2.1 类的封装方式

public: 类内,类外都可以访问
protected 类内可以访问, 类外不可以访问,子类可以访问
private 类内可以访问, 类外不可以访问,子类不可以访问

// 设计圆类求周长
#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;

const double pi = 3.14;
// 1. 设计一个类,求圆的周长
class Circle
{
public:  // 公共权限
    // 半径, 成员属性
    int R;
    // 求圆的周长
    double calculateZC()
    {
        return 2 * pi * R;
    }
    // 成员函数是可以修改成员属性的
    void setR(int r)
    {
        R = r;
    }
};

void test01()
{
    Circle c1;
    c1.setR(10);
    // c1.R = 10;
    cout << "c1的周长是 " << c1.calculateZC() << endl;
}

int main()
{
    test01();
    return EXIT_SUCCESS;
}
// 设计学生类

/*
设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
*/
#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<string>
using namespace std;

class Student
{
    double Height;  // 默认是 private, 私有在外部不可访问
protected:   // 保护权限, 类内部可以访问,(当前类的子类可以访问), 类外部不可访问
    {
        double Weight;
        void setWeight()
        {
            Weight = 100.0;
        }
    }
public:  // 公共权限
    string Name;
    int ID;
    void setName(string name)
    {
        Name = name;
    }
    void setID(int id)
    {
        ID = id;
    }
    void showInfo()
    {
        cout << "stu的姓名是 " << Name << endl;
        cout << "stu的序号是 " << ID << endl;
    }

};

void test01()
{
    Student stu;
    stu.setName("wangyong");
    stu.setID(27);
    cout << "stu的姓名是 " << stu.Name << endl;
    cout << "stu的序号是 " << stu.ID << endl;
    stu.showInfo();
}

int main()
{
    test01();
    return EXIT_SUCCESS;
}

2.2 建议将类中属性设为私有

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<string>
using namespace std;

class Person
{
public:

    // 获取姓名, 读权限
    string getName()
    {
        return name;
    }

    // 设置姓名, 写权限
    void setName(string n)
    {
        name = n;
    }

    // 获取年龄, 读权限
    double getAge()
    {
        return age;
    }

    // 写入对象, 写权限
    void setObj(string o)
    {
        obj = o;
    }

private:
    string name;       // 读写权限
    double age = 27.0; // 读权限
    string obj;        // 只写
    
};

void test01()
{
    Person p1;
    p1.setName("王勇");
    p1.setObj("xxx");
    cout << "姓名:  " << p1.getName() << endl;
    cout << "年龄:  " << p1.getAge() << endl;
}

int main()
{
    test01();
    return EXIT_SUCCESS;
}

 

posted on 2022-03-14 20:01  软饭攻城狮  阅读(15)  评论(0编辑  收藏  举报

导航