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. 大多数情况下该类型只是一些数据时,结构时最佳的选择,因为类访问数据 通常需要函数辅助。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python读取excel单元格内容_python如何读取文件夹下的所有文件

    python读取excel单元格内容_python如何读取文件夹下的所有文件python读取excel文件的内容可以方便我们查看信息。#-*-codeing=utf-8-*-#@Time:2022/4/1621:06#@Author:ning#@File:xlsx.py#@software:PyCharm#引入xlrd2去支持读取xlsx相关的文件importxlrd2#定义文件名file_name=’4016.xlsx’#读取xlsx文件#预计输出#4016.xlsx该文件有2个tab页sku_

    2022年10月2日
    1
  • Clover 引导器.配置助手[通俗易懂]

    Clover引导器.配置助手.Yosemite版块.更新贴Beta2.0为了让各位下载更方便本帖不设置回帖可见希望路过的朋友帮顶有需要的朋友顶个帖让更多后来者们看见提取码[编译PKG]py81[编译EFI+boot1h2]8ctu[编译ISO]zq9f首先向Clover开发人员致敬:Slice,withhelpofKabyl,

    2022年4月10日
    33
  • 单目视觉定位测距的两种方式[通俗易懂]

    单目视觉定位测距的两种方式[通俗易懂]单目定位和双目定位的选择,我觉得主要还是成本和时间的考虑。之前也尝试过双目定位,感觉要更精准些,但双目测距需要对两幅图像进行图像变换和极线匹配,稍微耗时了一些。这几天尝试了一下单摄像头进行测距定位,主要有两个思路:  1.定位测量插值得到每个像素的实际坐标    该方法总觉得有很大的问题:一个是摄像头安装后就必须固定不动,稍微的旋转都会导致之间测量的像素点对应的坐标偏移。另一个是人工测量的

    2022年6月15日
    130
  • rabbitmq使用案例_标点符号的正确使用方法及例子

    rabbitmq使用案例_标点符号的正确使用方法及例子一些概念:RabbiMQ的认知:首先要抛弃熟悉的客户端和服务器的观念。对于RabbitMQ应该认为是消息投递服务。、               其次:从应用程序角度来看RabbitMQ的话,应用程序要先决定是个消息的发送者还是消息的接受者。                    如果从RabbitMQ的角度来看的话…

    2022年10月3日
    0
  • ssh 报Connection closed by 127.0.0.1 port 的解决办法

    ssh 报Connection closed by 127.0.0.1 port 的解决办法起了一个虚拟机,想要通过ssh从host连接。起虚拟机时加上如下命令行:-netdevuser,id=net0,hostfwd=tcp::2222-:22\-devicevirtio-net-pci,netdev=net0\这样就将host的2222端口转发给虚拟机的22端口。sshroot@localhost-p2222得到Connection……

    2022年9月25日
    0
  • 最全的ios系统导出微信聊天记录&生成词云教程

    首先放一张我的iPhone手机导出微信聊天记录生成的词云效果图(个别敏感词汇请大家自行忽略hhh):对于如何导出手机上的微信聊天记录,网上绝大部分教程提到的“楼月微信聊天记录导出恢复助手”和“手机博士微信聊天记录查看”等软件都是收费的,免费版本只能查看很少的几条聊天记录并且不能导出。在这里提供一种绝对免费的方法可以方便地导出微信聊天记录,后面附上根据聊天记录生成词云的教程。由于我个人的手机是i…

    2022年4月8日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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