C++面向对象(OOP)编程-类与结构体的区别

本文主要介绍C++中结构体和类的区别,抓住其本质,默认的权限等不同。

目录

1 C++中结构体

2 对别C++中类和结构体

2.1 本身成员的默认访问级别不同

2.1.1 struct用法

2.1.2 class用法

2.2 继承类的默认访问级别不同

2.3 赋值方式的区别

3 总结


1 C++中结构体

        C++中的 struct 对C中的 struct 进行了扩充,它不再是只能用来封装不同类型数据的数据结构了,而是拥有了更多的功能。可以包含成员函数,可以继承,可以实现多态等,这些功能与C++中的类很相似。

        C语言中要求一个结构或联合至少有一个成员。C语言中,空结构体的大小为0,而C++中空结构体(属于空类)的大小为1。

2 对别C++中类和结构体

2.1 本身成员的默认访问级别不同

        这是最本质的区别。

        结构体的成员和成员函数在默认情况下的访问级别是公有的(public)。

        类的成员和成员函数在默认情况下的访问级别是私有的(private)。
        注意: 二者的访问方式都是 对象名+点(对象成员选择运算符)+访问对象成员

2.1.1 struct用法

        不加任何访问限定符,struct默认访问权限是public,即成员可直接在结构体外被访用。其他用法与class类似,即对象定义时struct类型也可省略。

#include 
using namespace std;

struct Person{
    public:
        int Age ;
        char Name[16];
};  

struct Person1{
	int Age =22 ;
    char Name[16] = "Tom";
}; 

int main()
{
	struct Person stu = { 18,"Hubery" };  //struct初始化
	cout<< stu.Name <<"  " <

        运行结果:

2.1.2 class用法

        不加任何访问限定符时,class默认访问权限是private,即类中的成员不能直接在类外被访问。若想实现在类外被访问则必须加public。

#include 
using namespace std;

namespace CLASS_DAY18
{
    class Student{
        public:
            int Age;
            string Name;
    };

    class Student1{
        public:
            int Age =22;
            string Name ="Tom";
    };
};


int main()
{
    {
        using namespace CLASS_DAY18;
        Student stu = {18,"Hubery"};  //class初始化
        cout << stu.Name <<"  "<< stu.Age <

        运行结果:

        如果类中不声明是public就会报错。

2.2 继承类的默认访问级别不同

        struct和class都可以被继承,且可以互相继承,但是struct作基类继承时,默认是public权限。而class作基类继承时,默认是private权限,因此要访问基类所有的成员变量和函数时,需要加public。

例如:

struct A{};class B{};// private 继承
class A{}; class B{};// private 继承

struct A{};public class B{};// public 继承
class A{}; public class B{};//public 继承

class A{};struct B{};// public 继承
struct A{};struct B{};// public 继承

    struct 仍然是一种数据结构的实现体,而class 则是一个对象的实现体。所以习惯struct 体内的变量叫做数据,class 内的变量叫做成员。

2.3 赋值方式的区别

struct A{char c1; int n2; float db3;};A a = {'a',1,3.14};

        上述可以直接给结构体赋值,但是不可以直接给类赋值。

        因为class中有默认的构造函数、析构函数等。struct默认没有构造函数和析构函数。

使用{}来对结构赋值,是一个初始化列表形式进行初始化,这样简单的初始化只能用在简单的数据结构上,如果加上构造函数,那么struct会表现出一种对象的特性,因此再使用这种方式赋值就会失效!

        也就是说当我们在一个结构中加入构造函数后,结构体的内部结构会发生变化;但加入一个普通函数,结构体内部结构依旧不变;因此可以理解为普通函数是一种对数据结构的算法,并不会打破原本数据的特性!

3 总结

        概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到
        类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异
        效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑
        关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段

        (1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct

        (2) 在表示数据量大、逻辑复杂的大对象时,首选class

        (3) 在表现抽象和多级别的对象层次时,class是最佳选择 
 

你可能感兴趣的:(C/C++精进之路,c++,开发语言,struct,class)