修正C++使用习惯避免使用using namespace std避免在循环中使用std::endl它做的不仅仅是换行,还有刷新缓存区,这需要更长的时间。所以使用换行符"\n"即可避免使用基于索引的for循环,而是选择跟能表达意图的range based loopfor(const auto &x: data) { }当存在已有标准算法可以完成要解决的任务时,避免自己写循环实现例如使用std::find_if()而不是自己写遍历查找避免在可以使用标准数组的地方使用C风格数组,C分割数组通常会退化成指针,并且需要传递数组的长度以及数组本身不了解字符串字面值的生命周期const char *string_literal_lifetimes() { return "string literals"; }像这样的字符串字面值被保证具有与程序相同的生命周期,这样不用担心他在函数返回后会被销毁使用结构化绑定下面是一个颜色名称和十六进制值的映射 然后遍历所有的键值对,并打印十六进制值void loop_map_items() { std::unorder
三Cpp的对象生存期(栈作用域生存期)简言之,在作用域内在栈上创建的变量会在作用域结束时被销毁。对于在堆上创造的变量,也可以通过构造函数和析构函数自动删除。Cpp的智能指针智能指针本质上是一个原始指针的包装,当你创建一个智能指针,它会调用new为你分配内存,然后基于你使用的智能指针,这些内存会在某一时刻自动释放。首先是最简单的unique_ptrunique_ptrunique_ptr是作用域指针,是超出作用域时,它会被销毁,然后调用delete。之所以叫unique_ptr,是因为你不能复制一个unique_ptr,如果你复制一个unique_ptr,那么你会有两个指针,两个unique_ptr指向同一个内存块,如果其中一个被销毁,他会释放那段内存,那么指向同一块内存的第二个unique_ptr指向了已经被释放的内存,所以不能复制unique_ptr。example:class Entity { public: Entity() { std::cout << "Creaded Entity"
二C++数组Array可以在堆(heap)上创建一个数组 int* another = new int[5]; //其作用域与在栈上创建不同,直到程序把它销毁之前,它都是处于活动状态的,需要用delete关键字来删除 delete[] another; 使用new动态分配最大的原因是生存期,用new来分配的内存,它将一直存在,直到手动删除它。如果你有一个函数返回一个数组,你必须使用一个new关键字来分配它,除非你传入一个数组的地址参数。在堆上创建数组,该数组指针所指的内容为一个地址,这个地址指向数组的第一个元素。所以,应该在栈上创建数组来避免这种情况,因为像这样在内存中跳跃肯定会影响性能另外,在栈上创建的数组可以用sizeof获得其大小,而在堆上创建的数组无法直接获得其大小,因为它只是一个地址,所以我们需要在创建数组时记录其大小 > C++11中有内置数据结构std::array,相较于原始数组有很多优点,例如边界检查,记录数组大小 include< array >std::array< int, 5 > another; ## **14.C++字符串*
一1.指针内容在C中已经熟悉指针本身为一个代表地址的整数指针的*运算符通常被称为dereference运算符,可逆引用指针。2.引用引用必须引用已经存在的变量,其本身不是变量也不占用内存,相当于变量的别名使用 int& 类此的形式声明引用变量其作用为向函数传递变量,而不是只传递值,这使得函数可以直接对变量进行操作。可以达到与使用指针相似的效果,但比使用直至简单。 例如用指针实现#include<iostream> void Increment(int* value) { (*value)++; } int main(){ int a = 5; Increment(&a); std::cout<<a<<std::endl; std::cin.get(); }引用实现#include<iostream> void Increment(int& value) { value++; } int main(){ int a = 5; Increment(a);
admin