C#和#x27;s默认关键字在C++;?

C#和#x27;s默认关键字在C++;?,c#,c++,default,C#,C++,Default,在C#中,我知道可以使用将默认值分配为0,将默认值分配给值类型,将默认值分配给引用类型,并将默认值分配给结构类型,从而相应地分配各个成员。据我所知,C++中没有默认值。在C++编程时,你会采用什么方法来获得与泛型的默认关键字相同的功能?p> 使用默认构造函数,即使在结尾处取消了(),也会使用它: #include <iostream> class MyClass { public: int x; MyClass(){ x = 5; }

在C#中,我知道可以使用将默认值分配为0,将默认值分配给值类型,将默认值分配给引用类型,并将默认值分配给结构类型,从而相应地分配各个成员。据我所知,C++中没有默认值。在C++编程时,你会采用什么方法来获得与泛型的默认关键字相同的功能?p> 使用默认构造函数,即使在结尾处取消了
()
,也会使用它:

#include <iostream>
class MyClass {
    public:
    int x;
    MyClass(){
        x = 5;
    }
};

int main(){
    MyClass y;
    std::cout << y.x;
}
#包括
类MyClass{
公众:
int x;
MyClass(){
x=5;
}
};
int main(){
我的y类;

STD::C++中的CUT< P>,在全局范围或函数中为变量赋值为默认值,如:

int myint=2;
float* pfloat=NULL;
对于类成员,您需要在类的构造函数中初始化它们:

class myclass {
private:
  int i;
public:
  myclass() {
    i = 4;
  }
};

我不确定结构。

假设类型是默认可构造的,您可以使用值初始化。例如

template <typename T>
T get()
{
    return T(); // returns a value-initialized object of type T
}
template <typename T>
T get(const T& default_value = T())
{
    return default_value;
}
模板
不明白
{
return T();//返回类型为T的值初始化对象
}
如果类型不是可默认构造的,通常需要提供一个要使用的默认值。例如

template <typename T>
T get()
{
    return T(); // returns a value-initialized object of type T
}
template <typename T>
T get(const T& default_value = T())
{
    return default_value;
}
模板
T get(常量T&default_值=T())
{
返回默认值;
}

此函数可以是不带参数的,如果类型是默认构造的。对于其他类型,可以提供返回值。

C++没有“<代码>默认< /Cord>>关键字,因为它没有引用和值类型之间的区别。在C++中,所有类型都是C *将考虑值类型的,如果它们是默认可构造(内置类型、POD结构和带有默认构造函数的类类型都是),它们是使用值初始化(默认构造函数语法)初始化的,正如James McNellis所示:(并无耻地复制到这里)

模板
不明白
{
return T();//返回类型为T的值初始化对象
}
如果
T
有一个默认构造函数,则调用它。如果没有构造函数,则将所有内容初始化为零/空


如果类型不是默认可构造的,那么就没有可以为对象指定的默认值。

这里是C++03中初始化技术的快速总结

将T类型的对象初始化为零意味着: -如果T是标量类型(3.9),则对象的值设置为0(零) 转换为T

— if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;

— if T is a union type, the object’s first named data member89) is zero-initialized;

— if T is an array type, each element is zero-initialized;

— if T is a reference type, no initialization is performed.
默认初始化T类型的对象意味着:

初始化T类型对象的值意味着: >

基于这种理解

struct S{
   int x;
   S():x(1){}
};

S sg;                    // Every object of static storage duration is zero initialized at program startup before any other initialization takes place. So 'x' is initialized to 0, before the default constructor runs and sets 'x' to 1.

int main{
   int x = int();        // value initialization syntax, as per rules above is initialized to 0.

    S sl;                // default initialized
}

<>在C++中,通常调用默认构造函数(可以用无参数调用的构造函数)。这也适用于原始类型(即,<代码> int())/>代码0,<代码> int *()/CUT>是空指针等。< /P> 例如,在模板函数中,您可以编写如下内容:

template<typename T>
T foo()
{
    T x = T(); // See notes below about this.

    // Do other stuff.

    return x;
}
模板
T foo()
{
T x=T();//请参见下面的注释。
//做其他事情。
返回x;
}

请注意,
tx;
本身就足以隐式调用非类型的默认构造函数,但对于将初始化为垃圾的原始标量类型(如
int
)则不起作用。(
tx()
也不起作用;)这是一个很好的问题。C++类型的PeltoRA使书写安全模板的种类低于疼痛。

template <typename T> struct FrameworkTemplate {
 T mInstance;
};
模板结构框架模板{
T敏度;
};
从理论上讲,用户可以将类模板实例化为

// assume A is a known default constructible type
FrameworkTemplate<A>
FrameworkTemplate<const A>
FrameworkTemplate<A const *>
FrameworkTemplate<A const &> // and so on
//假设A是已知的默认可构造类型
框架模板
框架模板
框架模板
框架模板//等等

这就是为什么像
any
nullable
lazy
等有用的泛型类型,虽然乍一看简单直观,但实现起来却不容易(安全)在C++中…

结构和类在C++中完全相同,只是它们的默认可见性。
// assume A is a known default constructible type
FrameworkTemplate<A>
FrameworkTemplate<const A>
FrameworkTemplate<A const *>
FrameworkTemplate<A const &> // and so on