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;来作为一个纯虚函数,含有纯虚函数的类为抽象基类。抽象基类负责定义接口,我们不能直接创建一个抽象基类对象。

名字查找优先于类型检查

如果派生类的成员与基类的某个成员同名,则派生类将在其作用域类隐藏该基类成员,即使派生类成员和基类成员的形参列表不一致。

猜你喜欢

转载自blog.csdn.net/potxxx/article/details/80649196