网站建设 素材,想学网络营销网站建设,常见营销策略都有哪些,MAKA网站做H5怎么压缩图片目录 前言#xff1a;
委托构造函数#xff1a;
类内初始化#xff1a;
空指针#xff1a;
枚举类#xff1a;
总结#xff1a; 前言#xff1a; C的学习难度大#xff0c;内容繁多。因此我们要及时掌握C的各种特性#xff0c;因此我们更新本篇文章#xff0c;向…
目录 前言
委托构造函数
类内初始化
空指针
枚举类
总结 前言 C的学习难度大内容繁多。因此我们要及时掌握C的各种特性因此我们更新本篇文章向大家介绍C的新增特性。
委托构造函数
委托构造函数是指一个类的构造函数调用另一个类的构造函数以减少代码冗余提高代码可读性。C11引入了委托构造函数的特性。
下面是一个委托构造函数的例子
class A {
public:A(int a, int b) : x(a), y(b) {}A(int a) : A(a, 0) {} // 委托构造函数调用上面的构造函数并初始化y为0
private:int x, y;
};在上面的例子中类A有两个构造函数其中第二个构造函数使用了委托构造函数的特性调用了第一个构造函数并将y初始化为0。这样在创建对象时只需要指定一个参数即可调用第二个构造函数不需要再写重复的代码。
下面是一个使用委托构造函数的例子
A a1(1, 2); // 调用第一个构造函数
A a2(2); // 调用第二个构造函数x为2y为0在上面的例子中创建了两个对象a1和a2分别调用了类A的不同构造函数。其中a2对象使用了委托构造函数的特性。
类内初始化
C11引入了类内初始化的特性可以在类的定义中为成员变量设置默认值。这样当创建对象时成员变量就会被初始化为默认值可以避免成员变量未被初始化的问题。
下面是一个类内初始化的例子
class A {
public:int x 1; // 类内初始化设置默认值为1double y 2.0;string s hello;
};在上面的例子中类A的成员变量x、y、s都使用了类内初始化的特性分别设置了默认值为1、2.0、hello。当创建对象时会自动将成员变量初始化为默认值。
下面是一个使用类内初始化的例子
A a1; // 创建对象a1x1, y2.0, shello
A a2 {3}; // 创建对象a2手动指定x的值为3y2.0shello在上面的例子中创建了两个对象a1和a2分别使用默认的构造函数和列表初始化的方式进行初始化。可以看到a1对象的x成员变量被默认初始化为1而a2对象手动指定了x的值为3。
空指针
C中的空指针是指指针变量没有指向任何有效的内存位置。可以使用空指针来检测指针是否已经被成功初始化或者指针是否指向有效的内存地址。
C中的空指针可以使用nullptr关键字进行初始化也可以使用NULL或0进行初始化。nullptr是C11中引入的新关键字将空指针与整数0进行区分开来推荐使用nullptr来初始化空指针。
下面是一个空指针的例子
int* p1 nullptr; // 使用nullptr关键字初始化空指针
int* p2 NULL; // 使用NULL宏初始化空指针
int* p3 0; // 使用0初始化空指针if (p1 nullptr) {cout p1 is a null pointer endl;
}if (p2 NULL) {cout p2 is a null pointer endl;
}if (p3 nullptr) {cout p3 is a null pointer endl;
}在上面的例子中声明了三个指针变量p1、p2、p3并使用不同的方式初始化为空指针。然后使用if语句检测每个指针变量是否是空指针并输出相应的信息。可以看到p1、p2、p3都是空指针if语句的条件都为真输出了相应的信息。
使用nullptr的优点
1. 增强类型安全性在 C 中一个空指针可以用 0 或 NULL 来表示但是它们实际上都是一个整数常量。因此如果将一个指针赋值为整数值时编译器可能不会给出任何警告这可能会导致程序出现意料之外的行为。使用 nullptr 可以有效避免这种情况因为 nullptr 是一个类型为 nullptr_t 的特殊常量不能被隐式地转换为其他类型只能赋值给指针类型。
2. 与函数重载结合使用在 C 中函数会根据参数的类型和数量匹配到不同的版本。如果某个函数有多个重载版本其中一个版本的参数类型为空指针而另一个版本的参数类型为整数那么当我们传递 0 时编译器可能无法确定我们需要调用哪个版本的函数。使用 nullptr 可以显式地指定空指针类型避免这种情况。
3. 跟踪函数重载调用nullptr 的类型是 nullptr_t而不是一个整数类型在函数调用时可以通过 nullptr 来推断参数类型。这对于模板编程和一些类型无关的代码非常有用。
总的来说nullptr 可以提高代码的可读性、可维护性和安全性是 C 程序员应该使用的空指针表示方式。
枚举类
C11 引入了一种新的枚举类型称为枚举类enum class也称作强类型枚举scoped enum。与传统的枚举类型相比枚举类有以下几个优点
1. 命名空间隔离使用枚举类可以定义一个新的命名空间避免命名冲突和全局名称空间污染。
2. 支持强类型枚举中的值不能被隐式转换为整数类型必须通过显式转换才能进行类型转换。这可以避免在不同枚举类型之间发生不必要的转换提高代码的类型安全性。
3. 支持指定底层类型可以指定枚举类型的底层类型可以是任何整数类型而不仅仅是 int 类型。这样可以提高内存使用效率并且可以在不同平台上保证枚举类型的大小和行为。
枚举类的定义方式与传统的枚举类型类似但需要在关键字 enum 后加上 class 或 struct 关键字。可以使用如下方式定义一个枚举类
enum class Color {RED,GREEN,BLUE
};在枚举类中每个枚举都是有名字的并且可以在枚举类的作用域之外使用双冒号::来限定名称。例如在上面的例子中可以使用以下方式声明和初始化一个枚举类型的变量
Color c Color::RED;需要注意的是枚举类可以指定底层类型表示枚举类型的默认底层类型是 int可以使用关键字 typename 来指定其他整数类型。例如我们可以定义一个使用 unsigned short 类型作为底层类型的枚举类
enum class Color : unsigned short {RED 1,GREEN 2,BLUE 4
};这种方式有助于减小内存使用并且可以确保枚举类型在不同平台上的行为是一致的。
总的来说枚举类是 C11 中一个非常有用的新特性可以提高代码的类型安全性、可读性和可维护性。在实际编程中应该尽可能地使用枚举类来定义枚举类型。
总结 本文因为篇幅原因并没有介绍完我们在下一篇文章中还会接着介绍剩下的六个特性这十个新增特性再一次丰富了C的使用因此我们要对这十个新增特性足够熟悉。