最近在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++_MVVM模式开发中一些小问题
- 最近在项目中总结的一些小问题
- 最近在用mvc3开发时遇到的一些小问题与解决方法....
- 在C++中一些小问题
- 开发中注意的一些小问题
- 安卓开发中一些小问题
- 最近遇到的一些小问题汇总
- 最近发现的一些小问题
- 最近遇到的一些小问题总结
- 敏捷开发模式在项目实际开发过程中一些问题
- 最近在开发中遇到的问题总结
- ++和——在c语言中应注意的一些小问题
- 最近在做一个配置管理软件碰到的一些小问题
- 在开发中一些非技术问题
- 最近开发中的一些工作思路问题
- ios中最近遇到的一些问题
- 在servlet中遇到的一些小问题
- 自己在拖xib中遇到的一些小问题
- 基于java聊聊架构
- 文章标题
- TreeMap分析
- 题目1167:数组排序 北航
- ISMS与信息安全的三观论
- 最近在C++_MVVM模式开发中一些小问题
- 1038. Recover the Smallest Number (30)
- 《Javascript高级程序设计》读书笔记之——Prototype
- 反思过去,以期少走弯路
- docker的php容器安装 memcached
- Extjs与Struts2交互,返回JSON数据的两种实现方式
- 图普科技招聘有关深度学习的解题?
- HttpClient的工具类
- 图普科技招聘有关深度学习的解题?