最近在C++_MVVM模式开发中一些小问题

来源:互联网 发布:专业定制软件 编辑:程序博客网 时间:2024/05/16 02:17

最近在C++_MVVM模式开发中一些小问题

注意由于算是初学,请大神笑笑翻过就好。

目录

  • 最近在C_MVVM模式开发中一些小问题
    • 目录
    • C语法问题
      • C中的explicit
      • C11标准中的stdshared_ptr
        • shared_ptr的功能
        • shared_ptr的构造
        • shared_ptr 的赋值
        • shared_ptr的类型转换
        • 从 shared_ptr 的对象获得传统 C 指针
        • shared_ptr 的常见的其它用法
      • C中类继承
        • 派生类
        • 多态
      • stdvector 容器中相关
        • 创建一个vector
        • 向vector添加一个数据
        • 详细功能

C++语法问题

C++中的explicit

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;}

C++11标准中的std::shared_ptr

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的功能

shared_ptr 主要的功能是,管理动态创建的对象的销毁。它的基本原理就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向某对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。
共享指针对象重载了 operator* 和 operator-> , 所以你可以像通常的指针一样使用它。这部分不再赘述。

shared_ptr的构造

  • 使用空参数构造函数构造
    也就是说,你可以直接定义一个 shared_ptr 而不指定构造函数的内容
    shared_ptr<T> ptr;
    这样做的话,ptr 的意义就相当于一个 NULL 指针。当你试图在一个空指针上做类似于 *ptr 或者 ptr->xx 之类的东西的时候,应该会收到异常的。

  • 直接从new操作符的返回值构造
    shared_ptr<T> ptr(new T());

  • 使用复制构造函数(或等号重载),从其它shared_ptr的对象构造
    shared_ptr<T> ptr1(new T()); // 本行与上一条中的构造方法是一样的
    shared_ptr<T> ptr2(ptr1); // 这就是使用复制构造函数的方法,会让引用计数加 1
    还有,shared_ptr 可以当作函数的参数传递,或者当作函数的返回值返回,这个时候其实也相当于使用复制构造函数。

  • 从 shared_ptr 提供的类型转换 (cast) 函数的返回值构造
    shared_ptr 也可以类型转换,有关类型转换的详情参见下面的 “shared_ptr 的类型转换”.
    此处假设 B 是 A 的子类,那么,在 C 语言中 B 的指针当然是可以转换成 A 的指针的。在共享指针里,应该这样做:
    shared_ptr<B> ptrb(new B());
    shared_ptr<A> ptra( dynamic_pointer_cast<A>(ptrb) );

shared_ptr 的“赋值”

shared_ptr 也可以直接赋值,但是必须是赋给相同类型的 shared_ptr 对象,而不能是普通的 C 指针或 new 运算符的返回值。
当共享指针 a 被赋值成 b 的时候,如果 a 原来是 NULL, 那么直接让 a 等于 b 并且让它们指向的东西的引用计数加 1; 如果 a 原来也指向某些东西的时候,如果 a 被赋值成 b, 那么原来 a 指向的东西的引用计数被减 1, 而新指向的对象的引用计数加 1. 就是说以下代码是允许的:

shared_ptr<T> a(new T());shared_ptr<T> b(new T());a = b; // 此后 a 原先所指的对象会被销毁,b 所指的对象引用计数加 1

shared_ptr 的对象在构造之后,可以被赋予空值,此时使用的应该是 reset() 函数,如:

shared_ptr<T> a(new T());a.reset(); // 此后 a 原先所指的对象会被销毁,并且 a 会变成 NULL//或者如下//shared_ptr<T> a(new T());a = shared_ptr<T>(); // 相当于给 a 赋一个新构造的 shared_ptr, 也就是 NULL

shared_ptr的类型转换

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 的对象获得传统 C 指针

shared_ptr<T> ptr(new T());T *p = ptr.get(); // 获得传统 C 指针

shared_ptr 的常见的其它用法

比如,“我想让一个已经构造好的共享指针,丢弃掉原来所指的对象(或者让其引用计数减 1),然后指向一个新的 new 出来的对象,该怎么办?”参考如下代码:

shared_ptr<T> ptr(new T());ptr.reset(new T()); // 原来所指的对象会被销毁

C++中类继承

派生类

公有派生

//simple base classclass Base{    //成员表};//simple derived classclass 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"<<endl;}//虚函数};class B : public A{    public:    void print(){cout<<"ThisisB"<<endl;}};

此时class A和class B的成员函数print都成了虚函数。即只要基类设为virtual,派生类相应函数也会自动变为虚函数。


std::vector 容器中相关

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

创建一个vector

template <class T>std::vector<T> v;//创建一个class T类型的空的vector对象。

向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[] 返回容器中指定位置的一个引用。
0 0
原创粉丝点击