C++之结构体与类

文章目录

结构体

  • C++中的结构体不仅可以包含不同类型的数据,而且还可以包含操作这些数据的函数
cpp 复制代码
#include <iostream>
using namespace std;
struct Complex{
    double r ; //实部
    double i; //虚部
    void init(double rr, double ii){
        r = rr;
        i = ii;
    }
    double real(){
        return r;
    }
    double image(){
        return i;
    }
};
int main(void){
    Complex a;
    a.init(2,3);
    cout << a.real() << " + " << a.image() << "i" << endl;
    return 0;
}
  • 将数据和操作数据的函数包装在一起的主要目的就是实现的封装和隐藏。隐藏就是不让结构体外的函数直接修改数据结构中的数据,只能通过结构的成员函数对数据进行修改。但上面的代码显然没能做到这一点。为此C++中新增了3个访问权限限定符,用于设置结构体中数据成员和函数成员的访问权限:
  • public
    • 公有成员(函数、数据), 可被任何函数访问(结构体内和结构体外)
  • protected
    • 保护成员, 与继承相关
  • private
    • 私有成员(函数、数据),只能被结构体内部函数访问
cpp 复制代码
#include <iostream>
using namespace std;
struct Complex{
private:
    double r ; //实部
    double i; //虚部
public:
    void init(double rr, double ii){
        r = rr;
        i = ii;
    }
    double real(){
        return r;
    }
    double image(){
        return i;
    }
    void set_real(double data){
        r = data;
    }
    void set_image(double data){
        i = data;
    }
};
int main(void){
    Complex a;
    a.init(2,3);
    //a.r = 8;
    a.set_real(8);
    cout << a.real() << " + " << a.image() << "i" << endl;
    return 0;
}

  • struct还是容易和传统C语言中的结构混淆,C++中引进了功能与struct相同,但更安全的数据类型:类
  • 更安全是指结构体将所有成员都默认为public,不够安全;类中成员默认为private权限
  • 语法格式
cpp 复制代码
class 类名{
private:
    成员数据;
    成员函数;
public:
    成员数据;
    成员函数;
protected:
    成员数据;
    成员函数;
}; //特别注意;不要忘了
cpp 复制代码
#include <iostream>
using namespace std;
//struct Complex{
class Complex{
private:
    double r ; //实部
    double i; //虚部
public:
    void init(double rr, double ii){
        r = rr;
        i = ii;
    }
    double real(){
        return r;
    }
    double image(){
        return i;
    }
    void set_real(double data){
        r = data;
    }
    void set_image(double data){
        i = data;
    }
};
int main(void){
    Complex a;
    a.init(2,3);
    //a.r = 8;
    a.set_real(8);
    cout << a.real() << " + " << a.image() << "i" << endl;
    return 0;
}
cpp 复制代码
#include <iostream>
using namespace std;
class Student{
private:
    string m_name;
    int m_age;
    int m_no;
public:
    void setName(const string& name){
        m_name = name;
    }
    void setAge(int age){
        if(age < 0)
        cout << "无效年龄" << endl;
        else
        m_age = age;
    }
    void setNo(int no){
        m_no = no;
    }
    void sleep(int hour){
        cout << "我睡了"<< hour <<"小时"<< endl;
    }
    void eat(const string &food){
        cout << "我正在吃" <<food << endl;
    }
    void learn(const string &course){
        cout << "我正在学习" << course << endl;
    }
    void who(){
        cout << "我叫: "<<m_name << ", 我今年" << m_age << endl;
    }
};
int main(void){
    Student s1;
    s1.setName("张飞");
    s1.setAge(21);
    s1.setNo(10003);
    s1.who();
    s1.eat("烧烤");
    Student s2;
    s2.setName("刘备");
    s2.setAge(28);
    s2.setNo(10000);
    s2.who();
    s2.learn("C++");
    return 0;
}
相关推荐
t-think3 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
cpp_learners4 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴4 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
David猪大卫5 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
广州山泉婚姻5 小时前
列表初始化:C++11全新初始化体系
c++·人工智能
莫生灬灬5 小时前
灵码 LingBuilder:用中文写代码,确定性生成真实 C++ 工程(开源)
c++·开源·mfc
浅念-5 小时前
C++ Protobuf 入门实战:基于通讯录项目吃透proto3语法与序列化
linux·服务器·网络·c++·protobuf·proto·proto3
汉克老师7 小时前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程7 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2957 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法