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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用idea进行activiti工作流开发[通俗易懂]

    使用idea进行activiti工作流开发[通俗易懂]使用idea进行activiti工作流开发emmm…….因为工作需要,所以要学习activiti工作流,初次学习,写个博客记录一下,下次再用就知道大概流程了。1、安装插件在idea里面,activiti的插件叫actiBPM,在插件库里面把它安装好,重启idea就行了。2、新建一个maven项目,并更改pom.xml。pom中依赖如下:&lt;dependen…

    2022年10月5日
    3
  • 排列组合cn和an公式[通俗易懂]

    排列组合cn和an公式[通俗易懂]排列组合cn和an公式?排列的公式:A(n,m)=n×(n-1)…(n-m+1)=n!/(n-m)!(n为下标,m为上标,以下同)。例如:A(4,2)=4!/2!=4*3=12。(考虑顺序,不考虑顺序则为6)组合的公式:C(n,m)=P(n,m)/P(m,m)=n!/m!*(n-m)!。例如:C(4,2)=4!/(2!*2!)=4*3/(2*1)=6。作者:浣熊数学链接:https://www.zhihu.com/question/26094736/answer/61071397

    2022年7月25日
    318
  • idea删除项目「建议收藏」

    idea删除项目「建议收藏」1.使用IDEA打开需要删除的项目,在项目文件上右击选择RemoveModule或者按Delete键2.之后会弹出删除提示,“RemoveModule‘xxx’fromtheproject?Nofileswillbedeleted.” 意思是移除指定模块,但没有文件被删除,就是说,模块移除了,磁盘上的文件还在点击“OK”之后,可以看到列表中还是存在些文件,这些文件是模…

    2025年6月12日
    23
  • 使用百度地图——入门

    使用百度地图——入门

    2022年1月17日
    43
  • 经典的量化交易算法

    经典的量化交易算法作者:徐Jebs来源:知乎加权平均价格算法(VMAP):以每一次交易的成交量为权重,一段时间内成交价格的加权平均值。该策略即利用历史成交量数据,将大段时间内的订单分割,成为动态发生的较小订单,目的是用接近成交量加权平均价格成交,从而以均价获利。该策略理论是以低于VWAP的价格买入或在以高于VMAP的价格卖出,则为好的交易。如图,在低于前一分钟的vmap时买入,高于…

    2022年6月26日
    73
  • vc6.0不能添加文件到工程_mdk工程添加另一个工程

    vc6.0不能添加文件到工程_mdk工程添加另一个工程曾经我有一个同学说它的VC软件只要选择添加文件到工程,软件就会崩溃,即停止运行,当时我就笑了,怎么可能会出现这个问题,只要你正常安装的话就不会出现这个问题了       结果之后我就遇到这个问题了,不知道什么时候我的软件也是不能选择添加文件到工程,只要选择这个,首先出来个对话框:      Windows正在收集解决方法什么的。。。。      对此,我把我的软件全部卸载,

    2022年8月12日
    4

发表回复

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

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