c++神奇的写法(一)

本文介绍了C++中的auto和decltype类型推导,展示了如何利用这些特性简化变量声明,并探讨了其在不同情况下的行为。此外,文章还介绍了使用标准库函数begin()和end()操作数组与vector的方法。

最近看《c++primer》一书,除了学到很多基础知识,还学到很多很神奇的写法,接下来就来总结一下,感觉就像黑魔法一样,虽然应该很少机会会用到:)

这里写图片描述

变量和基本类型


auto类型说明符

  • 作用:能让编译器替我们去分析表达式的类型
  • 注意点:
    1. auto定义的变量必须有初始值
    2. 使用auto也能在一条语句中声明多个变量,但是他们的类型必须相同
    3. auto未必会推断出正确的类型
      • 当引用被作为初始值时,编译器会以引用所指的类型作为auto的类型
      • auto一般会忽略顶层const,但会保留底层const
      • 如果希望保留引用或顶层const的话,要明确指出来
    int a = 1,&b = a;
    const int c = 1,&d = c;
    auto x_1 = a; //x_1 is int
    auto x_2 = b; //x_2 is int
    auto x_3 = c; //x_3 is int
    auto x_4 = d; //x_4 is int
    auto x_5 = &a; //x_5 is a pointer to int
    auto x_6 = &c; //x_6 is a pointer to const int
    const auto x_7 = d; //x_7 is const int
    auto &x_8=c; //x_8 is a reference to const int
    const auto &x_9=32; //x_9 is a reference to const int

(c++11标准)


decltype类型指示符

  • 作用:希望从表达式推断出要定义的类型,但不用表达式的值初始化变量
  • 注意点:
    1. 不会忽略顶层const和引用
    2. 有些表达式会给decltype一个引用的类型
    3. decltype((variable))的结果永远是引用,decltype(variable)的结果只有当variable是一个引用时才是引用,因为(variable)会看成是一个表达式

*当我们对某个函数用decltype时,得到的是function type,而不是a pointer to function


字符串、向量和数组


标准库函数begin()和end()

  • 作用:返回指向首指针和尾后指针
  • 注意点:定义在iterator头文件

使用数组初始化vector对象

  • 步骤:
    int int_arr[ ]={0,1,2,3,4,5};
    vector<int> ivec(begin(int_arr),end(int_arr));
  • 注意点:不允许使用一个数组初始化另外一个数组,也不允许使用vector对象初始化数组,但是可以用数组来初始化vector对象

用new动态分配内存

  • default initialized(会导致built-in-type对象有undefined值)
    int *pi = new int; // pi指向uninitialized int
    string *ps = new string; // ps指向空string
  • direct initialized(和copy initialized相对的那个)
    int *pi = new int(1024);
    string *ps = new string(10,'9');
  • list initialized
    vector<int> *pv = new vector<int>{0,1,2,3,4,5};
  • value initialized
    string *ps = new string(); // ps指向空string
    int *pi = new int(); // pi指向0
  • auto initialized
    auto p1 = new auto(obj);
<think>好的,用户之前询问了关于VTK中AddActor顺序对显示优先级的影响,现在他们又提出了个关于C++写法的问题。我需要先理解用户的需求。用户可能是在学习VTK的同时,需要了解如何在C++中正确编写相关代码,或者他们可能对C++的基础语法和最佳实践感兴趣。 首先,用户的问题比较广泛,仅提到“C++ 写法”,没有具体说明是语法、项目结构、面向对象还是其他方面。因此,我需要提供个全面的概述,涵盖C++的基础语法、常用特性、编程规范以及实际应用示例,同时结合用户之前的VTK问题,可能涉及图形编程相关的C++写法。 接下来,我要确保回答结构清晰,分点说明,符合用户要求的“帮助用户逐步解决问题”。可能需要分为基础语法、面向对象、标准库使用、内存管理、编程规范、实际案例等部分。同时,用户可能对如何在VTK中使用C++编写代码感兴趣,所以可以添加个VTK相关的例子,比如创建Actor的代码片段。 需要检查是否需要强调与VTK相关的C++特性,比如指针管理、对象生命周期等,因为VTK大量使用智能指针和工厂方法。此外,用户之前的回答中提到了Python示例,但C++写法有所不同,特别是在资源管理和对象创建方面,需要明确指出这些差异。 还要注意用户可能对现代C++C++11及以上)的特性感兴趣,如auto关键字、范围for循环、智能指针等,这些内容有助于编写更安全、更简洁的代码。同时,内存管理是C++中的重要部分,特别是与VTK结合使用时,正确使用智能指针可以避免内存泄漏。 最后,确保回答符合格式要求:行内数学表达式用$...$,独立公式用$$...$$,但可能在这个问题中数学公式较少,主要关注代码示例。需要提供正确格式的C++代码块,并注释说明关键点。此外,用户可能需要实际应用中的建议,比如在VTK项目中的最佳实践,所以结合之前的问题,给出相关示例会更有帮助。</think>以下是关于C++编程核心写法的结构化总结,涵盖语法规范、特性应用和最佳实践: --- ### 、基础语法规范 1. **代码结构** ```cpp #include <iostream> // 头文件包含 using namespace std; // 命名空间声明(谨慎使用) int main() { // 主函数入口 cout << "Hello World"; return 0; // 返回状态码 } ``` - 避免全局`using namespace std`,推荐显式指定如`std::cout` 2. **变量与类型** ```cpp int num = 10; // 整型 double pi = 3.14159; // 双精度浮点 char c = 'A'; // 字符 bool is_valid = true; // 布尔 auto str = "C++17"; // 自动类型推导(C++11+) ``` 3. **复合类型** ```cpp int arr[5] = {1,2,3}; // 数组 vector<int> vec {4,5,6}; // 动态数组(需#include <vector>) string s = "Modern C++"; // 字符串对象 ``` --- ### 二、核心特性应用 1. **面向对象编程** ```cpp class Shape { // 基类 public: virtual double area() const = 0; // 纯虚函数(抽象类) }; class Circle : public Shape { // 派生类 private: double radius; public: Circle(double r) : radius(r) {} // 构造函数初始化列表 double area() const override { // 重写虚函数 return 3.14159 * radius * radius; } }; ``` 2. **模板编程** ```cpp template <typename T> // 泛型模板 T max(T a, T b) { return (a > b) ? a : b; } // 特例化版本 template <> string max<string>(string a, string b) { return (a.length() > b.length()) ? a : b; } ``` 3. **现代C++特性(C++11+)** - Lambda表达式: ```cpp auto sum = [](int a, int b) -> int { return a + b; }; cout << sum(3, 5); // 输出8 ``` - 智能指针: ```cpp unique_ptr<int> ptr1 = make_unique<int>(10); // 独占所有权 shared_ptr<int> ptr2 = make_shared<int>(20); // 共享所有权 ``` --- ### 三、关键编程实践 1. **内存管理** - 优先使用智能指针而非裸
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值