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

发布时间:2023年12月19日

本文主要介绍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 <iostream>
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 <<"  " <<stu.Age<< endl;
	
	struct Person1 s ;  
	cout<< s.Name <<"  " <<s.Age<<endl;
	s.Age = 55;
	cout<< "修改Tom年龄后: " << s.Name <<"  " <<s.Age << endl;;
	return 0;
}

? ? ? ? 运行结果:

2.1.2 class用法

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

#include <iostream>
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 <<endl;
        
        Student1 s;
        cout << s.Name <<"  "<< s.Age <<endl;
        s.Age = 55;
        cout<< "修改Tom年龄后:" << s.Name <<"  " <<s.Age << endl;
    }
	
	return 0;
}

? ? ? ? 运行结果:

? ? ? ? 如果类中不声明是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是最佳选择?
?

文章来源:https://blog.csdn.net/m0_47324800/article/details/135082378
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。