// 两者均在编译器执行类型推导
auto a = 1;
const int& b = 2;
decltype(b) c = 3;
int a = 1; // a是左值
int b = a + 1; // b+1的返回值以及1字符型常量,均为右值
int& c = a; // 左值引用
int&& d = std::move(a); // 通过std:move将左值a转换为右值,从而使用右值引用
std::forward<int&>(a); // 完美转发,a是左值引用类型
直接对变量使用列表初始化值,包括基本数据类型、数组、STL
float a{10.2};
int b[2] = {1, 2};
std::vector<int> c{1, 3 ,6};
// 1.lamdba表达式,
// []不捕获任何变量;
// [&]引用捕获,捕获外部作用域所有变量,在函数体内当作引用使用;
// [=]值捕获,捕获外部作用域所有变量,在函数内内有个副本使用
// [a]只值捕获a变量,不捕获其它变量
// [this]捕获当前类中的this指针
vector<int> nums{2, 6, 3, 8};
auto sort_nums = [](int a, int b) -> bool {return a > b;}
std::sort(nums.begin(), nums.end(), sort_nums);
// 2.function函数
void print_nums(int a) {
std::cout << "a: " << a << std::endl;
}
std::function<void(int)> fun = print_nums; // function调用函数对象
fun(12);
// 3.std::bind函数
double callableFunc (double x, double y) {return x/y;}
auto NewCallable = std::bind (callableFunc, std::placeholders::_1,2);
std::cout << NewCallable (10) << '\n'; // 相当于调用NewCallable(10, 2),因为其中2被绑定
for (const auto& ele : elems) {
std::cout << "ele: " << ele << std::endl;
}
std::shared_ptr<int> a_ptr = std::make_shared<int>(2);
std::weak_ptr<int> b_ptr = a_ptr;
std::unique_ptr<int> c_ptr = std::make_unqiue<int>(3);
class base {
public:
base() = default;
virtual void function() {
}
};
class derived : base {
public:
dervied() = default;
void function() override {
std::cout << "override" << std::endl;
}
};
互斥锁:用于多线程编程的同步机制,保证同一时刻只能有一个线程访问共享资源。
条件变量:用于多线程编程的同步机制,可以让一个线程在某些条件不满足时等待,并在条件满足时被唤醒;通常与互斥锁一起使用,以保证唤醒等待的线程能获得锁。
互斥锁用于保护共享资源;条件变量用于多线程协作运行。
void run(int nums) {
nums++;
}
std::thread thread_process = std::thread(run, 10);
std::mutex lock_mutex;
std::lock_guard<std::mutex>(lock_mutex);
std::atomic<bool> process_single;
普通锁仅保证多线程访问共享数据时互斥,同一时刻只能有一个线程访问共享数据;
读写锁允许多个线程同时读取共享数据,但有线程对数据写入时,其他线程不能对数据执行读写操作。
C++多态机制是通过虚函数实现,允许程序运行时根据对象类型动态调用函数。
类中声明函数为虚函数,则C++会在类中增加一个虚函数表,该表中存储所有的虚函数地址,每个对象都有一个指向虚函数表的指针。
多态机制可增加代码的灵活性和可扩展性,减少代码的冗余性。
vector可通过reverse预留足够多的内存空间,从而避免内存重新分配。
两者区别:可以有const指针,但没有const引用;指针可以为空,但引用必须被初始化;指针可以有多级,但引用只有一级。
构造函数不能是虚函数,因为构造函数是用来产生对象的,但虚函数是基于对象;
基类的析构函数可以是虚函数,可保证通过基类指针删除派生类对象时的正确资源回收,避免内存泄漏。
进程是计算机中的一个独立的执行单元,它是操作系统进行资源分配和调度的基本单位;线程是进程的一个执行流,是 CPU 调度和分配的基本单位。
STL容器分为两大类:序列式容器和关联式容器
序列式容器:vector(动态数组),deque(双端队列),list(双向链表),array(固定长度数组);
关联式容器:map(键值对升序集合),set(不重复元素升序集合),unordered_map(键值对无序集合),unordered_set(不重复元素无序集合),multiset(可重复元素升序集合),multimap(可重复键值对升序集合);
封装: 允许通过类隐藏实现细节,提供公共接口供其他函数使用,其数据封装和访问控制有助于防止不正确的访问。
多态: 包括静态多态(函数重载和操作符重载)和动态多态(虚函数运行时绑定);
继承: 允许一个类从另一个类继承数据成员和成员函数,并且可以扩展或修改其行为,提供了代码复用和层次化的结构。
内存泄漏:程序运行过程中,由于某种原因导致程序无法释放已经不再使用的内存,导致系统内存资源浪费。
防止内存泄漏:C++11提供智能指针,可以有效确保不使用的对象可释放(shared_ptr的引用计数为0即释放资源);针对new的对象,不使用时需要使用delete释放。
vector是动态数组,属于STL(标准模板库) 的一种模板类型,内部通过动态数组存储元素,可在运行时动态改变底层数组容量,增加的元素超过当前最大容量,可自动分配内存(分配方式是在原来基础之上扩充两倍),一般提前预留容量(reserve)可避免二次内存分配,提高效率。
虚函数是指在另一个类中希望重写的成员函数,使用基类指针指向派生类对象时,调用虚函数时,实际调用的是派生类的函数。
类中一旦存在虚函数,变量便会多出一个虚函数表指针,空间会增大4字节(32位4字节,64位8字节)。
虚函数表数量:是一个类中虚函数的数量;
单例模式(Singleton Pattern),设计模式之一,保证一个类仅有一个实例,并提供全局访问入口函数,该实例被所有程序模块共享。
class base {
static int base_variable;
};
int base::base_variable = 10;
class base {
public:
base() = default;
virtual void function() = 0;
};
class base_a : public base {
public:
base_a() = default;
void function() override {
std::cout << "function" << std::endl;
}
};
虚函数用于实现多态;重载用于提供函数的不同形式。