C++基础知识之struct和class的区别

来源:互联网 发布:美工岗位描述 编辑:程序博客网 时间:2024/06/01 08:00

struct是结构体,可以包含不同的数据类型;class是类,两者之间存在着一些主要的差别,如下所示:

1. struct的成员默认是public访问类型,而class的成员默认是private类型,这也体系了类的封装性;2. struct也可以继承,但默认是public继承,而class默认是private继承;2. struct一般只有成员变量而没有成员函数,而class既有成员变量也有成员函数,即封装了数据和对数据的操作;

两者最核心的区别在于:struct和class的默认访问权限和默认继承权限,示例如下:

struct Base{    Base() {} //默认的无参构造函数    Base(int Val_a) : a(Val_a) {} //自定义的有参构造函数    int a;    int b;    virtual int GetNum() const{return a;} //可以包含函数,虚函数};struct Derived : Base //默认的继承是public继承,而不是private继承{    int c;    int d;    inline int GetNum() const {return a;} };

代码解释:这个时候结构体Derived是public继承于结构体Base的。如果都将上面的struct改成class,那么Derived是private继承于struct Base的。这就是默认的继承访问权限。 所以我们在平时写类继承的时候,通常会这样写:class Derived : public Base就是为了指明是public继承,而不是用默认的private继承;

struct派生于class或者class派生于struct
struct Base //结构体{    Base() {} //默认的无参构造函数    Base(int Val_a) : a(Val_a) {} //自定义的有参构造函数    int a;    int b;    virtual int GetNum() const{return a;}};class Derived : Base //子类,此时默认的是private{    int c;    int d;    inline int GetNum() const {return a;}};

代码解释:前面已经说了,struct默认是public继承,而class默认是private继承。如果是class派生于struct,或者struct派生于class, 那么是public继承还是private继承呢?答案是取决于子类,也就是说如果子类是struct,则不管基类是struct还是class都是public继承;如果子类是class,则不管基类是struct还是class都是private继承,除非显式说明。

struct A{};class B : A{}; //private继承,因为子类是classstruct C : B{}; //public继承,因为子类是struct

个人还是推荐在继承的时候还是要显示地指出继承控制是public/private/protected;

struct和class的其它一些小区别

class可以用于定义模板参数,就像typename,而struct是不行的,如下所示:

template <class T> //可以用class定义模板参数class Base{    T Data;//定义一个T类型的成员变量}

struct的初始化方式: 如果struct只有成员变量,则可以直接赋值初始化,如下所示:

struct Base{    int a;    int b;};Base BaseTest={1,2};//赋值a=1,b=2

但是如果在struct里面加上普通的函数,则仍然可以直接赋值初始化;如果struct里面包含了虚函数,则不能用直接赋值的方式进行初始化了,因为有了虚函数就应该有虚函数指针了;当然,如果class里面只有数据成员而没有虚函数,则也可以直接赋值初始化;

class Base {};Base BaseTest={...};//直接赋值初始化,OK

一个综合的演示示例:

#include "iostream"using namespace std;struct Base{    Base() {} //默认的无参构造函数    Base(int Val_a) : a(Val_a) {} //自定义的有参构造函数    int a;    int b;    virtual int GetNum() const{return a;}};class Derived : Base //子类是class,所以默认是private继承{public: //默认访问是private,所以要改成public    int c;    int d;    inline int GetNum() const {return a;}};int main(){    Base BaseTest(1);//有参构造函数,OK    BaseTest.b=2;    Derived DerivedTest;    DerivedTest.c=3;    DerivedTest.d=4;    cout<<BaseTest.GetNum()<<endl;    return 0;}

综上所示:struct能够包含函数,能够包含构造和析构函数,能够包含虚函数和纯虚函数,能够实现多态,但默认是public访问和public继承;class默认是private访问,private继承;这一点体现出了面向对象的封装性;

0 0