你可能会感兴趣的 5 个隐藏的 C++ 语言特性 【已翻译100%】

简介:

一天又一天,C++ 是越来越火起来了. 作为一种范式覆盖语言,C++的这些隐藏特性基本上就基本上只是对其现有的基础设施的灵活使用. 其实还有更多的这样的设施,而我们也乐于听见读者对此能够有所补充.

1. 众所周知的三元运算符 (?:), 许多人并没有意识到它可以作为左值来使用.

x = (y < 0) ? 10 : 20;
(a == 0 ? a : b) = 1;

不这样的话,你就只能得像下面这样写了,

if (a == 0)
a = 1;
else
b = 1;

2. 命名空间别名这一特性你也可能会很容易的错过. 一旦你了解了它,你就会认识到它是无所不在的. 当你在在编写一端带有许多命名空间层级结构的大型代码时,它是特别的有用啊.

namespace x = boost::filesystem;

x::path myPath(strPath, fs::native );

3. 变量并不是唯一能够在函数的初始部分被声明的东西. 你也可以声明类和其它的函数.

for(struct { int x; float y; } loop = { 1, 2 }; ...; ...) {
...
}

4. 一元的 + 运算符可以被用来增进或者消退某些东西的量. 见下面的一些示例.

+EnumeratorValue: 这能给予你的枚举值一个完美的整形, 其能让枚举值适合它的值. 这在实现针对枚举的操作符重载时相当的有用.

向变量传递一个临时的值: 你可以为使用这个操作符的变量创建一个临时的值. 例如,如果你有一个使用了一个没有任何外部的类定义的内部的类静态初始化器的类,但有时系统会链接失败,这样的类的话.

struct Foo {
static int const value = 42;
};

template
void f(T const&);

int main() {
// fails to link and tries to get the address of "Foo::value"!
f(Foo::value);

// works - pass a temporary value
f(+Foo::value);
}

递减一个数组的指针: 操作符也能在你想要传递两个值到一个函数中时起作用.

template
void f(T const& a, T const& b);

int main() {
int a[2];
int b[3];
f(a, b); // won't work! different values for "T"!
f(+a, +b); // works! T is "int*" both time
}

5 . 你必须知道有 id/标识 的元函数。现在就看看这个针对他的用例吧,其适用于没有模板的情况.

// void (*f)(); // same
id::type *f;

// void (f(void(p)()))(int); // same
id::type f(id::type p);

// int (*p)[2] = new int10; // same
id::type *p = new int10;

// void (C::*p)(int) = 0; // same
id::type C::*p = 0;

It helps decrypting C++ declarations greatly!

//几乎跟 boost::identity 是一样的
template
struct id { typedef T type; };

相关文章
|
10月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
286 15
|
5月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
489 12
|
9月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
363 12
|
10月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
228 8
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
367 59
|
安全 编译器 C++
【C++11】新特性
`C++11`是2011年发布的`C++`重要版本,引入了约140个新特性和600个缺陷修复。其中,列表初始化(List Initialization)提供了一种更统一、更灵活和更安全的初始化方式,支持内置类型和满足特定条件的自定义类型。此外,`C++11`还引入了`auto`关键字用于自动类型推导,简化了复杂类型的声明,提高了代码的可读性和可维护性。`decltype`则用于根据表达式推导类型,增强了编译时类型检查的能力,特别适用于模板和泛型编程。
166 2
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
346 5
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
158 1
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
161 1
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
171 1