c++入门学习
c++知识点小记
使用assign(仅顺序容器)
vector<char> c;
vector<int> i;
i.assign(c.begin(),c.end()); //不同类型元素的替换
使用swap使用swap元素不会真正移动。对于string会导致指针失效,对于array会真正交换元素;
使用insert
vector<int> i1{ 1,2,3,4,5 };
auto x = i1.begin() + 2;
i1.insert(x, { 111,222,333 }); //在x前插入
emplace操作当调用push或insert时先构造一个临时对象再拷贝这个对象,而emplace直接在容器的内存空间内构造对象;
string的find方法与算法库的find函数
find方法未找到返回string::npos(-1);find函数返回一个迭代器,未找到则迭代器指向序列末尾;
bind参数绑定
auto g = bind(f,a,b,_2,c,_1); //f为接受五个参数的函数
g(x,y);//将参数a,b,c,绑定于g
反向迭代器
当我们从一个普通迭代器初始化为一个反向迭代器,或是给一个反向迭代器赋值时,结果迭代器与原迭代器指向的并不是相同的元素。反向迭代器使用base方法得到普通迭代器。
析构函数
析构函数会首先执行程序体然后按照成员初始化顺序的逆序销毁成员。
如果一个类需要自定义析构函数,几乎可以肯定他也需要自定义拷贝赋值运算符和拷贝构造函数。
=delete
class my{
my() = default; //使用默认的构造函数
my(const my&) = delete;//阻止拷贝
}
可以对任何函数使用=delete,但不能创建析构函数delete的临时对象。allocator类
allocator<double> allo;
auto const p = allo.allocate(10);
allo.construct(p,10,10);
使用allocator类可以将内存分配与对象构造分离
右值引用与std::move与引用限定符
右值引用可以简单的理解为对没有名字的值的引用,std::move的作用是获得一个左值的右值引用;
引用限定符&、&&为指定函数引用为左值或右值引用;
重载==与<操作符
如果存在唯一一种逻辑可靠的<定义,则应该为这个类定义<运算符。如果类同时还包含==,则当且仅当<的定义和==产生的结果一致时才定义<运算符。
initializer_list<T>
不确定个数形参函数可以使用如fun(initializer_list<string> str){}
调用如fun({"hello","world",...});
函数对象
重载了()操作符的类对象可以作为类似函数的方式使用;
sort(str.begin(),str,end(),greater<string>()); //在算法中使用标准库函数对象
虚函数与默认实参
使用virtual定义虚函数;
如果我们通过基类的引用或指针调用函数,则使用基类中定义的默认实参,即使实际运行的是派生类中的函数版本也是如此。
如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。
纯虚函数与抽象基类
可以将类的方法定义为fun( ) = 0;来作为一个纯虚函数,含有纯虚函数的类为抽象基类。抽象基类负责定义接口,我们不能直接创建一个抽象基类对象。
名字查找优先于类型检查
如果派生类的成员与基类的某个成员同名,则派生类将在其作用域类隐藏该基类成员,即使派生类成员和基类成员的形参列表不一致。所以想要覆盖基类虚函数,那么派生类中的虚函数必须与基类中的虚函数必须有相同的形参列表。
虚析构函数
如果我们删除的是一个指向派生类对象的基类指针,则需要虚析构函数;
virtual~base() = default;
虚继承
不论虚基类在继承体系中出现了多少次,在派生类中都只包含唯一一个共享的虚基类子对象。
//指定虚基类的方式是在派生列表中添加关键字virtual
class child :public virtual base{};
自定义类使用set
一般需要在自定义类里重载<操作符
bool operator<(const T&) const{
//满足相等返回false}
上一篇: 电脑版UC浏览器怎么截图?UC浏览器电脑版截屏方法介绍
下一篇: C语言入门学习