问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#、C++中,struct 和class 在声明和初始化上及构造函数上有什么区别

发布网友 发布时间:2022-06-05 14:30

我来回答

4个回答

热心网友 时间:2023-11-23 19:02

C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。
struct能包含成员函数吗? 能!
struct能继承吗? 能!!
struct能实现多态吗? 能!
最本质的一个区别就是默认的访问控制,体现在两个方面:
1)默认的继承访问权限。struct是public的,class是private的。
写如下的代码:
struct A
{
char a;
};
struct B : A
{
char b;
};
这个时候B是public继承A的。如果都将上面的struct改成class,那么B是private继承A的。这就是默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:
struct B : public A
就是为了指明是public继承,而不是用默认的private继承。
当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:
struct A{};
class B : A{}; //private继承
struct C : B{}; //public继承
2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
3)“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
4) 还是上面所说的,C++中的struct是对C中的struct的扩充,既然是扩充,那么它就要兼容过去C中struct应有的所有特性。例如你可以这样写:
struct A //定义一个struct
{
char c1;
int n2;
double db3;
};
A a={'p',7,3.1415926}; //定义时直接赋值
也就是说struct可以在定义的时候用{}赋初值。

热心网友 时间:2023-11-23 19:02

您好,C#中,结构的确是不能显式声明无参数的构造函数的,同时它也不能定义析构函数。无参数的构造函数由运行时提供,用于初始化结构的数据成员,结构定义的构造函数必须为结构包含的每个字段赋值。

另外,C#中的结构的确是在执行到调用结构成员的时候才会被初始化,您可以看一下这段代码:

/*
testStruct.cs
Code to test the struct in c#
david, 2007-04-02
use "csc.exe testStruct.cs" to compile the code.
Have fun!
*/

using System;

namespace TestStruct
{
public struct Human
{
int age;
string name;

public Human(string Name, int Age) //结构不能有无参数的构造函数。
{
age = Age;
name = Name;
}

public string GetName()
{
return name;
}

public string GetAge()
{
return age.ToString();
}

public string Name // 结构可以包含属性
{
get
{
return name;
}
}

public override string ToString() // 重载了ToString()方法。
{
return name + age.ToString();
}
}

public class MainClass
{
private static void Main()
{
Console.WriteLine("hello, world!");
Human david = new Human("david", 20);
Console.WriteLine("Information about a human david:\nName:\t{0}\nAge:\t{1}", david.Name/*david.GetName()*/, david.GetAge());
Console.WriteLine("Here are the Info from ToString() mothed:\t{0}", david.ToString());
}
}
}

代码中Main方法的IL代码如下:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// 代码大小 77 (0x4d)
.maxstack 3
.locals init (valuetype TestStruct.Human V_0)
IL_0000: nop
IL_0001: ldstr "hello, world!"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ldloca.s V_0
IL_000e: ldstr "david"
IL_0013: ldc.i4.s 20
IL_0015: call instance void TestStruct.Human::.ctor(string,
int32)
IL_001a: nop
IL_001b: ldstr "Information about a human david:\nName:\t{0}\nAge:\t{1}"
IL_0020: ldloca.s V_0
IL_0022: call instance string TestStruct.Human::get_Name()
IL_0027: ldloca.s V_0
IL_0029: call instance string TestStruct.Human::GetAge()
IL_002e: call void [mscorlib]System.Console::WriteLine(string,
object,
object)
IL_0033: nop
IL_0034: ldstr "Here are the Info from ToString() mothed:\t{0}"
IL_0039: ldloca.s V_0
IL_003b: constrained. TestStruct.Human
IL_0041: callvirt instance string [mscorlib]System.Object::ToString()
IL_0046: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_004b: nop
IL_004c: ret
} // end of method MainClass::Main

从这里可以看出,结构的确是在输出“Hello, world”字符串后才被初始化的。

希望这些信息对您有帮助,谢谢。

热心网友 时间:2023-11-23 19:03

学计算机语言,最好是看原版教材,如果是学习C++,建议你看C++的发明者所写的书吧,相信你肯定会有收获的

热心网友 时间:2023-11-23 19:03

struct里能有构造函数?那是Class里独有的东西。

您先找本高级点的书好好看看吧,不是那么简单的,很多入门书连皮毛都讲不到,由其是C++的教程,我初学C++,不过看得是C++ Primer,讲得很清楚,不过一遍肯定是看不太明白,多看几遍就懂了。

C#一点也不懂~反正C和C++的结构体好像都没有构造函数的说法,C#进步了哟~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小篇幅造句 易车如何发布二手车 转让卖车信息流程 《易车》群聊消息关闭方法 易车消息夜间勿扰方法步骤 易车如何开启消息夜间勿扰 易车 开启@消息推送 ...当入射角是 时,反射角是 。我们能从各个方向看到本身不发光的物体... 发泄的近义词和反义词是什么_发泄是什么意思? 我的世界手游 我的世界手机版怎么做末地传送门? 我的世界手游 末地传送门怎么做? 安全评价师的报考科目有什么 微信好友被删了,自己又不知道他的了。怎么找回? 七个多月了。能吃汤圆吗?快点帮我回答 怀孕六个月,吃汤圆可以吗 电信volte打电话会更贵吗 双通道内存比普通单内存大约快多少? 怎么防止被封 我开通了花呗为什么收不到花呗呢 我开通了花呗收钱 为啥收不到花呗红包支付的钱 xs和ss哪个大 我开通了花呗收款怎么收不了 手机版4399游戏盒怎么改密码 4399手机版游戏盒可以改密码吗 DP-646w驱动怎么下载? 怎样安装dp8760c打印机程序 联想DP600打印机怎么安装 怎么下载宠物小精灵DP全集? 经侦怎么调查保险案件 陌陌怎么用注册? 我才买的手机号已经绑定了别人的,该怎么办? 新换的手机号绑定了别人的怎么办? 蜂蜜柠檬水做好是直接取蜂蜜还是取柠檬喝 蜂蜜柠檬茶可以现做吗 就是现在用 柠檬 蜂蜜做了直接能喝的 ??? 还有不能用开水吗 蜂蜜柠檬茶怎么做好喝 考过英语四级,去考成人高考的英语能得多少分? 信用卡欠款2.6万,今天广发银行发短信通知恶意欠款,但预计三天内能还清,请问1.现在与银行沟通是 ...去评论时出现评论超期。根本评论不了。返回页面后待评价里也没... 淘宝显示有一条待评价信息,我进去怎么什么也没有啊 面条怎么吃去火 梦见被蛇咬到左手臂后逃到河里 梦见被蛇咬到左手臂没流血,缠了自己一会,就跑去我舅舅家了? 这二天梦二次说蛇,第一次和蛇打架,今天梦到被蛇咬到左臂,是怎么了 WORD编辑状态怎么退出? dell笔记本电池充电禁用,无法充电怎么解决? 三重一大会议和董事会的区别 烟草行业三重一大的含义是 有些青少年在朋友圈或QQ空间里随意晒出个人和家庭信息。专家认为这样做有一定风险的英文 矫正牙齿期间,如何护理牙齿 会字用做名字可理解为什么 有没有会起名字的 ——会 (现实生活中的一个会)帮派名字