C++结构体和类的区别_c++有结构体吗

C++结构体和类的区别_c++有结构体吗这是对多个博客的总结————————————————————————————区别:1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。2.结构使用栈存储(Stac…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

这是对多个博客的总结

————————————————————————————

区别:

1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。

那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。

2.结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)

栈的空间相对较小.但是存储在栈中的数据访问效率相对较高.

堆的空间相对较大.但是存储在堆中的数据的访问效率相对较低.

3.类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体也可以继承,也可以有函数(c中结构体没有函数),但是不具备类的继承多态特性

4.结构体赋值是 直接赋值的值. 而对象的赋值的是传递对象的地址

5.结构体内默认“数据“访问权限和继承权限是public,对象内“”成员“”默认访问权限和继承权限是private。结构体和类可以交叉继承,继承权限取决于子类而不是基类。 

struct A{};
class B : A{};//private继承
struct C : B{}; //public继承

Jetbrains全家桶1年46,售后保障稳定

struct A//定义一个struct
{
char c1;
int n2;
double db3;
}; 
A a={'p',7,3.1415926}; //定义时直接赋值 可行
class A//定义一个struct
{
char c1;
int n2;
double db3;
};
A a={'p',7,3.1415926}; //定义时直接赋值  会报错!!!,因为class内默认访问属性为private
class A//定义一个struct
{
public:
char c1;
int n2;
double db3;
};
A a={'p',7,3.1415926}; //添加了public:之后,可以定义时直接赋值

6.继承模板参数中,可以使用class定义,但是不能用struct来定义!

template <class T>\\正确
struct Person
{
public:
    T age;
};



template <typename T>\\正确
struct Person
{
public:
    T age;
};



template <struct T>\\错误
struct Person
{
public:
    T age;
};

7.C语言中,空结构体的大小为0,而C++中空结构体/类 的大小为1。

C++中空类的大小为1的原因:

  空类也可以实例化,类实例化出的每个对象都需要有不同的内存地址,为使每个对象在内存中的地址不同,所以在类中会加入一个隐含的字节。

一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的。 
对象大小= vptr() + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器)

#include <iostream>
using namespace std;
class A { };
class B {
char ch;
void func() { }
};
class C {
char ch1; //占用1字节
 char ch2; //占用1字节
 virtual void func() { }
};
class D {
 int in;
 virtual void func() { }
};
 int main() {
A a;
B b;
C c;
D d;
cout<<sizeof(a)<<endl;//result=1   
cout<<sizeof(b)<<endl;//result=1   //对象c扩充为2个字,但是对象b为什么没扩充为1个字呢(空类的对象一个字节,含一个char的类类对象也为一个字节。)?因为B类只有一个成员变量,普通成员函数不占用内存。
cout<<sizeof(c)<<endl;//result=8   
//对象c实际上只有6字节有用数据,但是按照上面第二点编译器优化,编译器将此扩展为两个字(add charles 字节对齐),即8字节
cout<<sizeof(d)<<endl;//result=8   
return 0;
}  

如何选择结构还是类

1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3. 在表现抽象和多级别的对象层次时,类是最好的选择
4. 大多数情况下该类型只是一些数据时,结构时最佳的选择,因为类访问数据 通常需要函数辅助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/228006.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android Hook 机制之简单实战[通俗易懂]

    Android Hook 机制之简单实战[通俗易懂]简介什么是HookHook又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。Hook分类1.根据Android开发模式,Native模式(C/C++)和Java模式(Java)区分,在Android平台上Java层级的Hook;…

  • 安卓应用程序开发_Android从入门到精通读书笔记

    安卓应用程序开发_Android从入门到精通读书笔记Android应用程序开发 第一章Android应用初体验1.1应用基础activity是AndroidSDK中Activity类的一个具体实例,负责管理用户与信息屏的交互。应用的功能是通过编写一个个Activity子类来实现的。布局定义了一系列用户界面对象以及它们显示在屏幕上的位置。组成布局的定义保存在XML文件中。…

  • HttpCanary下载_自我介绍网页模板代码

    HttpCanary下载_自我介绍网页模板代码前言首先,我们无论学习哪个框架,都要带着问题,带着思考去学习思考1:HttpRunner是什么?思考2:HttpRunner的设计模式是什么?思考3:为什么我们要学习HttpRunner?他的

  • 线性分类模型

    线性分类模型

  • C++字符串常见操作函数最全总结

    C++字符串常见操作函数最全总结在做题过程中经常用到字符串,有时候费了很大力气去写一个函数,结果最后发现C++已经封装好了此类函数。。。所以花点时间总结一下。

  • 哈佛幸福课笔记!「建议收藏」

    哈佛幸福课笔记!「建议收藏」https://www.bilibili.com/video/BV1Gs411o71d?p=1记笔记的小天才!我应该多想想,如何将课程中的知识,运用到实际生活中,而不是只记录下来!Part1theimportanceofsilence,安静时刻的重要性,无论在家里还是,课堂,公司享受安静embracesilence(可能是这个课程最重要的)真正的学习,发生在你尝试分辨,什么是真正重要的,什么舍弃,什么保留,而这些都发生在安静自省时例子:连续不断进入迷宫的老鼠,

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号