注意由于算是初学,请大神笑笑翻过就好。
explicit adj. 详述的,明晰的,明确的
explicit构造函数是用来防止隐式转换的,有如下代码:
class Test1
{
public:
Test1(int n)
{
num=n;
}//普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n)
{
num=n;
}//explicit(显式)构造函数
private:
int num;
};
int main()
{
Test1 t1=12;//隐式调用其构造函数,成功
Test2 t2=12;//编译错误,不能隐式调用其构造函数
Test2 t2(12);//显式调用成功
return 0;
}
std::shared_ptr is a smart pointer that retains shared ownership of an object through a pointer.
std::shared_ptr 是一个智能指针,通过一个指针来共享保留同一个对象。
A shared_ptr can share ownership of an object while storing a pointer to another object. This feature can be used to point to member objects while owning the object they belong to.
shared_ptr 可以在存储一个指向其他对象的指针时,共享一个对象的所有权。这个功能可以用来指向成员对象,而且拥有他们所属的对象。
shared_ptr 主要的功能是,管理动态创建的对象的销毁。它的基本原理就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向某对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。
共享指针对象重载了 operator* 和 operator-> , 所以你可以像通常的指针一样使用它。这部分不再赘述。
使用空参数构造函数构造
也就是说,你可以直接定义一个 shared_ptr 而不指定构造函数的内容
shared_ptr
这样做的话,ptr 的意义就相当于一个 NULL 指针。当你试图在一个空指针上做类似于 *ptr 或者 ptr->xx 之类的东西的时候,应该会收到异常的。
直接从new操作符的返回值构造
shared_ptr
使用复制构造函数(或等号重载),从其它shared_ptr的对象构造
shared_ptr
shared_ptr
还有,shared_ptr 可以当作函数的参数传递,或者当作函数的返回值返回,这个时候其实也相当于使用复制构造函数。
从 shared_ptr 提供的类型转换 (cast) 函数的返回值构造
shared_ptr 也可以类型转换,有关类型转换的详情参见下面的 “shared_ptr 的类型转换”.
此处假设 B 是 A 的子类,那么,在 C 语言中 B 的指针当然是可以转换成 A 的指针的。在共享指针里,应该这样做:
shared_ptr ptrb(new B());
shared_ptr ptra( dynamic_pointer_cast(ptrb) );
shared_ptr 也可以直接赋值,但是必须是赋给相同类型的 shared_ptr 对象,而不能是普通的 C 指针或 new 运算符的返回值。
当共享指针 a 被赋值成 b 的时候,如果 a 原来是 NULL, 那么直接让 a 等于 b 并且让它们指向的东西的引用计数加 1; 如果 a 原来也指向某些东西的时候,如果 a 被赋值成 b, 那么原来 a 指向的东西的引用计数被减 1, 而新指向的对象的引用计数加 1. 就是说以下代码是允许的:
shared_ptr a(new T());
shared_ptr b(new T());
a = b; // 此后 a 原先所指的对象会被销毁,b 所指的对象引用计数加 1
shared_ptr 的对象在构造之后,可以被赋予空值,此时使用的应该是 reset() 函数,如:
shared_ptr a(new T());
a.reset(); // 此后 a 原先所指的对象会被销毁,并且 a 会变成 NULL
//或者如下//
shared_ptr a(new T());
a = shared_ptr(); // 相当于给 a 赋一个新构造的 shared_ptr, 也就是 NULL
shared_ptr 有两种类型转换的函数,一个是 static_pointer_cast, 一个是 dynamic_pointer_cast.
shared_ptr<A> ptra;
shared_ptr<B> ptrb(new B());
ptra = dynamic_pointer_cast<A>(ptrb);
shared_ptr ptr(new T());
T *p = ptr.get(); // 获得传统 C 指针
比如,“我想让一个已经构造好的共享指针,丢弃掉原来所指的对象(或者让其引用计数减 1),然后指向一个新的 new 出来的对象,该怎么办?”参考如下代码:
shared_ptr ptr(new T());
ptr.reset(new T()); // 原来所指的对象会被销毁
公有派生
//simple base class
class Base
{
//成员表
};
//simple derived class
class Derived : public Base
{
//成员表
};
冒号指出Derived类的基类是Base类。派生类对象包含基类对象。
派生类对象存储了基类的数据成员。(派生类继承了基类的实现)
派生类对象可以使用基类的方法。(派生类继承了基类的接口)
如果我们希望同一个方法在派生类和基类中的行为不同。换句话说,方法的行为取决于调用该方法的对象。这种行为成为多态——具有多种形态。
多态有个关键之处就是一切用指向基类的指针或引用来操作对象。例如以下代码:
int main()
{
//main2
A a;
B b;
A *p1 = &a;
A *p2 = &b;
p1->print();
p2->print();
return 0;
}
class A
{
public:
virtual void print(){cout<<"This is A"<//虚函数
};
class B : public A
{
public:
void print(){cout<<"ThisisB"<
此时class A和class B的成员函数print都成了虚函数。即只要基类设为virtual,派生类相应函数也会自动变为虚函数。
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
template <class T>
std::vector v;//创建一个class T类型的空的vector对象。
vector添加数据的缺省方法是push_back。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。
函数 | 表述 |
---|---|
c.assign(beg,end) | 将[beg; end)区间中的数据赋值给c。 |
c.assign(n,elem) | 将n个elem的拷贝赋值给c。 |
c.at(idx) | 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 |
c.back() | 传回最后一个数据,不检查这个数据是否存在。 |
c.begin() | 传回迭代器中的第一个数据地址。 |
c.capacity() | 返回容器中数据个数。 |
c.clear() | 移除容器中所有数据。 |
c.empty() | 判断容器是否为空。 |
c.end() | 指向迭代器中的最后一个数据地址。 |
c.erase(pos) | 删除pos位置的数据,传回下一个数据的位置。 |
c.erase(beg,end) | 删除[beg,end)区间的数据,传回下一个数据的位置。 |
c.front() | 传回第一个数据。 |
get_allocator | 使用构造函数返回一个拷贝。 |
c.insert(pos,elem) | 在pos位置插入一个elem拷贝,传回新数据位置。 |
c.insert(pos,n,elem) | 在pos位置插入n个elem数据。无返回值。 |
c.insert(pos,beg,end) | 在pos位置插入在[beg,end)区间的数据。无返回值。 |
c.max_size() | 返回容器中最大数据的数量。 |
c.pop_back() | 删除最后一个数据。 |
c.push_back(elem) | 在尾部加入一个数据。 |
c.rbegin() | 传回一个逆向队列的第一个数据。 |
c.rend() | 传回一个逆向队列的最后一个数据的下一个位置。 |
c.resize(num) | 重新指定队列的长度。 |
c.reserve() | 保留适当的容量。 |
c.size() | 返回容器中实际数据的个数。 |
c1.swap(c2) | 将c1和c2元素互换。 |
swap(c1,c2) | 同上操作。 |
vector c | 创建一个空的vector。 |
vector c1(c2) | 复制一个vector。 |
vector c(n) | 创建一个vector,含有n个数据,数据均已缺省构造产生。 |
vector c(n, elem) | 创建一个含有n个elem拷贝的vector。 |
vector c(beg,end) | 创建一个以[beg;end)区间的vector。 |
c.~ vector () | 销毁所有数据,释放内存。 |
operator[] | 返回容器中指定位置的一个引用。 |