C#、C++中,struct 和class 在声明和初始化上及构造函数上有什么区别
C#中好像class可以声明的同时初始化,struct不行。不确定是否和编译器有关。还有就是构造函数:class可以自己写构造,struct不允许------这话不知道我...
C#中好像class可以声明的同时初始化,struct不行。不确定是否和编译器有关。
还有就是构造函数:class可以自己写构造,struct不允许------这话不知道我说的对不,或者说的浮浅了。
C#中:编译器会为struct创建一个默认构造函数,所以无法重复声明默认构造函数。因此,是struct不允许自己写默认的(无参数的)构造,而不是说它没有构造函数。 C#是以C++ 为基础发展起来的,我不敢说C++一定也是这样,但很可能也是编译器创建的,所以你看不到。
构造函数初始化时间:构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。 展开
还有就是构造函数:class可以自己写构造,struct不允许------这话不知道我说的对不,或者说的浮浅了。
C#中:编译器会为struct创建一个默认构造函数,所以无法重复声明默认构造函数。因此,是struct不允许自己写默认的(无参数的)构造,而不是说它没有构造函数。 C#是以C++ 为基础发展起来的,我不敢说C++一定也是这样,但很可能也是编译器创建的,所以你看不到。
构造函数初始化时间:构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。 展开
4个回答
展开全部
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可以在定义的时候用{}赋初值。
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可以在定义的时候用{}赋初值。
展开全部
您好,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”字符串后才被初始化的。
希望这些信息对您有帮助,谢谢。
另外,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”字符串后才被初始化的。
希望这些信息对您有帮助,谢谢。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
学计算机语言,最好是看原版教材,如果是学习C++,建议你看C++的发明者所写的书吧,相信你肯定会有收获的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
struct里能有构造函数?那是Class里独有的东西。
您先找本高级点的书好好看看吧,不是那么简单的,很多入门书连皮毛都讲不到,由其是C++的教程,我初学C++,不过看得是C++ Primer,讲得很清楚,不过一遍肯定是看不太明白,多看几遍就懂了。
C#一点也不懂~反正C和C++的结构体好像都没有构造函数的说法,C#进步了哟~
您先找本高级点的书好好看看吧,不是那么简单的,很多入门书连皮毛都讲不到,由其是C++的教程,我初学C++,不过看得是C++ Primer,讲得很清楚,不过一遍肯定是看不太明白,多看几遍就懂了。
C#一点也不懂~反正C和C++的结构体好像都没有构造函数的说法,C#进步了哟~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询