介绍C++ 基本特性,衍生高级篇内容。摘自«C++高级编程»。

特性

类型转换

float myFloat = 2.34'56'7;
int i1 = static_cast<int>(myFloat);

枚举(强/弱)

enum GN
{
    King,
    Queue
};

GN myEnum = GN::King;
if(myEnum == 0){}     // 可比较

// 强枚举类型
enum class GM: unsigned long
{
    KING,    
    QUEUE = 10
}

GM myEnumm = GM::KING;
if(myEnumm == GM::QUEUE) {}  // 不可以直接与数字比较

函数

std::cout << __func__  << std::endl;

函数替换(trailing return type)

auto func() -> int
{
    return ...   
}

// 类型推断  auto
auto func()   // 去掉拖尾
{    
    return ...  // 第一次return必须为非递归调用
}

// decltype
int x = 123;
decltype(x) y = 1233; 

数组

// C 风格数组
int myArr[] = {1,2,3}; 
int myArr1[2] = {0};

// <array> C++
std::array<int,3> myArr2 = {2,3,4};
std::cout << myArr2[0];
std::cout << "Size: " << myArr2.size();

int Arr[] = {1, 2, 3};
int Arr[3] = {};
int* Arr = new int[3];

堆栈与堆

堆栈和堆是内存开辟出来的区域。堆栈顶部为程序当前作用域,通常为当前执行函数,注当前函数中声明的变量占用顶部堆栈的内存。如果当前函数调用其他函数,其他函数将拥有自己的堆栈帧,从当前函数传递参数给其他函数,是通过堆栈帧间数据的拷贝。在堆栈上所分配的内存,不需要程序员释放,这个内存删除的过程将自动完成执行。

堆则是与当前函数/堆栈帧完全没有关系的内存区域。如果想要在函数结束后,仍然保留其中声明的变量,可以将变量放到堆中。必须确保释放在堆上所分配的内存。除了智能指针。

指针

int* myIntegerPointer = nullptr;

/// 使用new操作符分配内存
myIntegerPointer = new int;

/// 对指针解除引用  ???
*myIntegerPointer = 8;

// 释放内存
delete myIntegerPointer;
myIntegerPointer = nullptr; 

问题

函数使用

头文件语法,包括标准库头文件略去”.h”

名称空间基本用法

语言基础 -循环语法

堆栈和栈

  • 堆栈是每个函数独立的内存空间 退出了会自动回收动态分配的内存

  • 堆是与当前函数/堆栈帧无关的其他内存空间 退出时需要自动释放动态申请的空间 否则容易导致内存泄漏等问题

动态分配数组

  • string *Arr = nullptr; Arr = new string[strlen(param_str)+1]; delete Arr; Arr=nullptr;

  • std::array<int,3> myArr = {1,2,3};

const的使用

  • 指定不能够修改的参数

  • 类中指定函数不能够修改类成员参数(mutable除外)

  • 向函数/方法传入参数,传入const&比复制副本效率更高

引用的含义

只是引用变量的别名,不存在空引用,必须指向一块合法内存,引用需要在创建时初始化(区别于指针),一旦某个引用初始化为一个对象,就不可以指向另一个对象。

auto关键字

  • 函数替换 auto func() -> int { // method…. }

  • 类型自动转换

STL容器基本用法 (std::vector)

了解名称空间、使用流而非printf()、包含标准头文件

support

https://www.w3cschool.cn/cpp/cpp-pointers.html

⤧  Next post sizeof&strlen 详述 ⤧  Previous post WebRTC