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


相关推荐

  • 基础野:细说无符号整数[通俗易懂]

    基础野:细说无符号整数[通俗易懂]Brief本来只打算理解JS中0.1+0.2==0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。本篇我们一起来探讨一下基础的基础

    2022年8月3日
    5
  • 方舟gg修改器下载之后怎么操作_方舟手游GG修改器怎么改经验

    方舟gg修改器下载之后怎么操作_方舟手游GG修改器怎么改经验方舟手游gg修改器脚本是一款很奈斯的辅助器,这款软件是为游戏定制的,功能十分强大,一键获取全地图视野,无视丛草,精准射击!感兴趣的用户赶快体验吧!方舟手游gg修改器脚本介绍方舟手游gg修改器脚本是一款数据信息开展非常好的改动,最值得一提的是游戏玩家彻底不必担心会被检验或是封禁,能够说成十分的安全性了,安装文件也是十分的小,需要的游戏玩家快点儿参加进去,这款手机软件能够非常好的协助你提升手机游戏的体…

    2025年9月15日
    4
  • idea2021.3.4激活码-激活码分享

    (idea2021.3.4激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S32P…

    2022年3月26日
    724
  • mysql截取字符串函数

    mysql截取字符串函数目标将rull字段值的0.1g*14粒/1.5mg*30片/100ml(氨甲环酸0.5g:氯化钠0.84g)*1瓶中的mg/g/ml开头的数字取出设置到另外一个字段上去SELECTid fromsheet2whererull like’%ml%’;SELECTid,count,LEFT(rull,LOCATE(‘g’,rull)-1) fromsheet2w…

    2022年6月5日
    30
  • awk从放弃到入门(9):awk数组详解

    awk从放弃到入门(9):awk数组详解 这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章。注:在阅读这篇文章之前,最好已经了解了一些开发的基本语法,比如,for循环、数组的基本使用等,否则在阅读时有可能遇到障碍。 前文中提及过,awk其实可以算作一门脚本语言,因为它包含了一个脚本语言的各种语法结构,比如条件判断语句,比如循环语句,那么,awk中能否使用"数组"呢?必须能啊,今天我们就来聊聊…

    2022年7月19日
    16
  • phpstorm 激活码 2021【在线注册码/序列号/破解码】

    phpstorm 激活码 2021【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    41

发表回复

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

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