网站建设html代码如何添加,pythons网站开发,wordpress 不同页面,wordpress 提问C的各种初始化
1.默认初始化
默认初始化是指定义变量时没有指定初值时进行的初始化操作。例如int a; Sales_data myData;等等。这些变量被定义了而不是仅仅被声明#xff08;因为没有extern关键字修饰#xff09;#xff0c;而且没有显式的赋予初值。特别的#xff0c;如…C的各种初始化
1.默认初始化
默认初始化是指定义变量时没有指定初值时进行的初始化操作。例如int a; Sales_data myData;等等。这些变量被定义了而不是仅仅被声明因为没有extern关键字修饰而且没有显式的赋予初值。特别的如果采用动态分配内存的方式即采用new关键字创建的变量不加括号时如int *pnew int;也是默认初始化加了括号如int *pnew int()为值初始化。变量的值与变量的类型与定义的位置有关系。
1对于内置类型变量如intdoublebool等如果定义在语句块外即{}外则变量被默认初始化为0如果定义在语句块内即{}内变量将拥有未定义的值。
2对于类类型的变量如string或其他自定义类型不管定义于何处都会执行默认构造函数。如果该类没有默认构造函数则会引发错误。因此建议为每个类都定义一个默认构造函数default。
2.值初始化
值初始化是值使用了初始化器即使用了圆括号或花括号但却没有提供初始值的情况。例如int *pnew int();vector vec(10);等等都是典型的值初始化方式。注意当不采用动态分配内存的方式即不采用new运算符时写成int a();是错误的值初始化方式因为这种方式声明了一个函数而不是进行值初始化。如果一定要进行值初始化必须结合拷贝初始化使用即写成int aint();值初始化和默认初始化一样对于内置类型初始化为0对于类类型则调用其默认构造函数如果没有默认构造函数则不能进行初始化。
3.直接初始化与拷贝初始化
直接初始化与拷贝初始化对应其内部实现机理不同。直接初始化是指采用小括号的方式进行变量初始化小括号里一定要有初始值如果没提供初始值那就是值初始化了。例如int a(12);Sales_data myData(para);vector ivec(ivec2);string s(“123456”);等等。拷贝初始化是指采用等号进行初始化的方式。例如int a12;string sstring(“123456”);等等。拷贝初始化看起来像是给变量赋值实际上是执行了初始化操作与先定义再赋值本质不同。
1对于内置类型变量如intdoublebool等直接初始化与拷贝初始化差别可以忽略不计。
2对于类类型的变量如string或其他自定义类型直接初始化调用类的构造函数调用参数类型最佳匹配的那个拷贝初始化调用类的拷贝构造函数。
特别的当对类类型变量进行初始化时如果类的构造函数采用了explicit修饰而且需要隐式类型转换时则只能通过直接初始化而不能通过拷贝初始化进行操作。
4.列表初始化
列表初始化是C 11 新引进的初始化方式它采用一对花括号即{}进行初始化操作。能用直接初始化和拷贝初始化的地方都能用列表初始化而且列表初始化能对容器进行方便的初始化因此在新的C标准中推荐使用列表初始化的方式进行初始化。列表初始化的应用场景有int a{12};string s{123};vector vec{1,2,3};这里一定要注意列表初始化使用的是花括号而不是圆括号
必须要使用列表初始化的几种情况
类成员为const类型类成员为引用类型
#include iostream
class A
{public:A(int v) : i(v), p(v), j(v) {}void print_val() { std::cout hello: i j std::endl;}private:const int i;int p;int j;
};int main(int argc ,char **argv)
{int pp 55;A b(pp);b.print_val();
}原因
const对象或引用只能初始化但是不能赋值。构造函数的函数体内只能做赋值而不是初始化因此初始化const对象或引用的唯一机会是构造函数函数体之前的初始化列表中。
从无到有叫初始化初始化调用拷贝构造函数创建了新对象赋值调用赋值操作符没有创建新对象而是对已有的对象赋值。
类成员为没有默认构造函数的类类型
#include iostreamclass Base
{public:Base(int a) : val(a) {}private:int val;
};class A
{public:A(int v) : p(v), b(v) {}void print_val() { std::cout hello: p std::endl;}private:int p;Base b;
};int main(int argc ,char **argv)
{int pp 55;A b(pp);b.print_val();
}原因同样是创建对象时要初始类成员的每一个成员(如果没有在初始化列表里面编译器会自动使用它的默认的构造函数进行初始化但是它没有默认构造函数所以会编译报错所以没有默认构造函数的成员变量需要使用初始化列表进行初始化)
如果类存在继承关系派生类必须在其初始化列表中调用基类的构造函数
#include iostreamclass Base
{public:Base(int a) : val(a) {}private:int val;
};class A : public Base
{public:A(int v) : p(v), Base(v) {}void print_val() { std::cout hello: p std::endl;}private:int p;
};int main(int argc ,char **argv)
{int pp 45;A b(pp);b.print_val();
}