一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象,也可以是一个函数 const app = new Vue({ el:"#app", // 对象格式...} } }) 组件中定义data属性,只能是一个函数 如果为组件data直接定义为一个对象 Vue.component('component1',{ template:`组件...警告说明:返回的data应该是一个函数在每一个组件实例中 二、组件data定义函数与对象的区别 上面讲到组件data必须是一个函数,不知道大家有没有思考过这是为什么呢?...在我们定义好一个组件的时候,vue最终都会通过Vue.extend()构成组件实例 这里我们模仿组件构造函数,定义data属性,采用对象的形式 function Component(){ } Component.prototype.data...data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况 组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。
类似的,我们也不用管读取的字符能存入一个char对象内,还是需要一个wchar_t对象来存储 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。...有时我们需要知道流为什么失败,IO库定义了下面一些列相关的知识 iostate: iostate提供了表达流状态的完整功能。...对应流的当前状态 setstate()函数:将给定条件为置位,表示发生了对应错误 clear()函数:有两个版本:一个不接受参数的版本,而另一个版本接受一个iostate类型的参数 无参数的clear(...,因此下面语句会导致cout的缓冲区被刷新: int ival;std::cin >> ival; //会刷新前面的输出缓冲区 tie有两个重载版本: 一个版本不带参数,返回指向输出流的指针。...如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联流,则返回空指针 一个版本接受一个指向ostream的指针,将自己关联到此ostream。
命名空间 使用命名空间,最好是分别引入,需要用哪个引用哪个,保证程序中名称的唯一性,避免全局污染(即自己定义与全局空间冲突) For example: Using std::cout 或直接编程用std...上面的括号不能去掉,去掉就是访问it的成员了,而it是一个迭代器,没有empty和uv1成员,所以不能去掉 C++定义了箭头运算符(->),将解引用和成员访问结合在一起(建议用箭头运算符) 所以 (*...中的一个例子,这个函数返回的是Sales_data的引用,函数的形参也是Sales_data的引用,比如说,定义了Sales_data的两个对象:total和trans 那么可以这样使用上面的函数,total.combine...(trans); 调用这个函数时,会将total的地址绑定在隐式的this参数上,this就具有了total的所有属性,而rhs绑定到了trans上,因此函数的第一行和第二行的uints_sold和revenue...构造函数和析构函数 在申明一个类的时候,我们可能会用到它的构造函数和析构函数,构造函数是在申明类的对象时进行的一个初始化函数,一般的,我们会在构造函数中初始化一些该类的参数,而析构函数则是在类的对象结束后运行的函数
我们来分析一下为什么 new 出来的 A 对象得不到释放。...(); return 0; } 分清楚场合应该使用哪种类型的智能指针: 通常情况下,如果你的资源不需要在其他地方共享,那么应该优先使用 std::unique_ptr,反之使用 std::...shared_ptr,当然这是在该智能指针需要管理资源的生命周期的情况下;如果不需要管理对象的生命周期,请使用 std::weak_ptr。...,而不是直接包含对应类的头文件。...: A *m_pA; }; 同样的道理,在头文件中当使用智能指针对象作为类成员变量时,也应该优先使用前置声明去引用智能指针对象的包裹类,而不是直接包含包含类的头文件。
4.1为什么用指针而不用对象 一般我们其实更容易见到的是MyCAS mycas,而这里则是MyCAS* m_instance m_instance是一个指向MyCAS实例的指针,这个实例是通过new...至于为什么单例模式通常使用指针来管理唯一实例,而不是直接创建一个对象,主要有以下几个原因: 控制实例化时间:使用指针和new操作符,我们可以在需要时才创建单例对象。...4.2为什么m_instance写在类外面 在C++中,静态成员变量是属于类的,而不是属于类的某个具体对象。这意味着无论创建多少个类的对象,静态成员变量只有一份拷贝。...静态成员变量可以被类的所有成员函数访问,包括非静态成员函数和静态成员函数。 静态成员函数: 静态成员函数没有this指针,因为静态成员函数属于类本身,而不是类的任何具体对象。...静态成员函数只能访问静态成员变量,它不能访问类的非静态成员变量。 静态成员函数可以在没有创建类的对象的情况下被调用,这是因为静态成员函数属于类本身,而不是属于类的任何具体对象。
自定义智能指针对象持有的资源的释放函数 默认情况下,智能指针对象在析构时只会释放其持有的堆内存(调用 delete 或者 delete[]),但是假设这块堆内存代表的对象还对应一种需要回收的资源(如操作系统的套接字句柄...假设现在有一个 Socket 类,对应着操作系统的套接字句柄,在回收时需要关闭该对象,我们可以如下自定义智能指针对象的资源析构函数,这里以 std::unique_ptr 为例: #include <iostream...我们来分析一下为什么 new 出来的 A 对象得不到释放。...,当然这是在该智能指针需要管理资源的生命周期的情况下;如果不需要管理对象的生命周期,请使用 std::weak_ptr。...A* m_pA; }; 同样的道理,在头文件中当使用智能指针对象作为类成员变量时,也应该优先使用前置声明去引用智能指针对象的包裹类,而不是直接包含包裹类的头文件。
,调用的是ReferenceController的DestroyObject而不是直接delete对象。...如果你看过stl的源码或用过std::shared_ptr,肯定知道创建指针的时候要尽可能用make_shared而不是直接使用构造函数,他们在内存的分配上有本质的差别。...为什么要专门提这一点,是因为UE4里有些比较睿智的API,理论上可以接受空对象,但函数的参数却只接受TSharedRef而不要TSharedPtr,这时还是可以自己搞个空壳对象换掉TSharedRef里的老对象...为什么要特意搞一个这样的类呢?可以想象一下,如果一个对象被外部的某个TSharedPtr管理,在自己的成员函数内,怎样获取外部的这个智能指针呢?...这种情况下如果把从TSharedFromThis获取到的智能指针作为lambda的upvalue而不是this本身,即使外部的TSharedPtr在加载期间释放了,lambda内部还留有一个TSharedPtr
Move. /* ---- 在传统 C++ 中,成员函数通过 this 指针访问。可以处理所有需要左值的情况。 我们是否可以省去拷贝,得到一个右值对象的右值成员?...引入 move 语义后,我们可以这么写 T t = std::move(alloc().value()); 勉勉强强可以转一下。得到一个右值。...qualifier 之后,我们可以非常直观地操作右值了: T& value() &; T&& value() &&; T t = alloc().value(); ---- 一些历史: 如果 value() 不是一个成员函数...---- 认识到 ref qualifier 修饰的是 this,而不是函数,可以把这个语法和 static,constexpr,noexcept,[[noreturn]]区分开。...认识到 ref qualifier 修饰的是引用的 this,而不是传统的 this 指针,可以理解为什么 ref qualifier 和 const qualifier 不能相互 override。
;}// Output:// Foo::f() 为什么我们能通过一个空指针调用成员函数?...*fptr 绑定fptr到对象obj,而 ->*fptr 则绑定fptr到指针p所指向的对象。(还有一个 重要的区别 是:我们可以重载后者,却不能重载前者)。在 (obj....成员函数指针不是常规指针 成员函数指针不像常规指针那样保存某个“准确”的地址。我们可以把它想像成保存的是成员函数在类布局中的“相对”地址。让我们来展示一下二者的不同。...这个例子证明了成员函数指针不是常规指针。另外,为什么C++如此费心地去发明这样的语法?很简单,因为它和常规指针是不同的东西,而且这样的类型转换也是违反直觉的。...(翻译君去看了一下 mem_fun() 的源代码,原来是用成员函数来构造仿函数functor的。) 成员函数调用和 this 指针 现在我们回到文章最开始的地方。为什么一个空指针也能调用成员函数?
要想写一个稍微大一点项目,以下知识需要继续巩固一下,再次回到基础知识哈。 1. 头文件 头文件或.h文件允许将相关的函数,方法和类声明收集在一个位置。然后可以将相应的定义放置在.cpp文件中。...一旦有了指针,您可能需要检索它所指向的对象。在这种情况下,*符号可以再次使用。然而,这一次,它将出现在一个方程的右边或一个已经定义的变量的前面,所以含义是不同的。...作为一个很好的经验法则,在可能的情况下,应该使用引用来代替指针。 但是,有时不能使用引用。一个例子是对象初始化。您可能希望一个对象存储对另一个对象的引用。...但是,如果在创建第一个对象时另一个对象尚不可用,则第一个对象将需要使用指针,而不是引用,因为引用不能为空,只能在创建另一个对象后初始化引用。 5....上面的代码仍然在创建汽车之后为每辆汽车设置属性。 添加一个构造函数 解决这个问题的最好方法是向Car类添加构造函数。构造函数允许您使用所需的数据实例化新对象。
substr O(n)复杂度 这是一个特别常用的函数,好在std::string提供了这个函数,美中不足的是其每次都返回一个新生成的子串,很容易引起性能热点。...实际上我们本意并不是要改变原字符串,为什么不在原字符串基础上返回呢? 在C++17中引入了string_view,能很好的解决以上两个问题。...:为什么我们代码string_view foo(string("abc"))可以编译通过,但为什么没有对应的构造函数?...2.4 示例 Haskell中有一个常用函数lines,会将字符串切割成行存储在容器里。...所以,推荐的使用方式:仅仅作为函数参数,因为如果该参数仅仅在函数体内使用而不传递出去,这样使用是安全的。
三、定义和初始化tuple 当我们定义一个tuple时,需要指出每个成员的类型: std::tuple threeD; //使用默认构造函数 std::tuple...{ //错误 return{ 1,2,3 };} 也可以使用make_tuple()函数来生成一个tuple对象: auto item = std::make_tuple("0-999-78345-X...用来创建一个tuple()对象。...支持的操作可以看出,可以用一个pair初始化一个双元素tuple,也可以将一个pair赋值给一个双元素tuple pair提供了一个特殊的构造函数,以tuple为初值(可以参阅前面的pair文章)...tuple的函数: 在指定的迭代器区间内寻找参数3所指定的元素 该算法默认使用<运算符来比较,因为Sales_data没有<运算符,因此我们传递给它一个名为compareIsbn函数的指针 该算法返回一个
通常缺省参数应从右往左定义,即后面的参数有缺省值,前面的没有。...由于 Windows 下 VS 的修饰规则过于复杂,而 Linux 下 G++ 的修饰规则简单易懂,我们使用 G++ 演示修饰后的名字。...,ref 不能再引用 b,只能修改 a 的值 ref = b; // 这只是把 b 的值赋给 a,而不是让 ref 引用 b 6.3 常引用 常引用(const reference)指向一个不能修改的变量...内联函数 7.1 概念 内联函数是使用 inline 关键字修饰的函数。在编译时,C++编译器会在调用内联函数的地方直接展开函数体,而不是进行正常的函数调用。...迭代的对象要实现 ++ 和 == 的操作 10. 指针空值 nullptr 10.1 C++98 中的指针空值 在 C/C++ 中,如果一个指针没有合法的指向,我们通常会将其初始化为 NULL。
对于下面的引用也是如此。 4.3 C++支持函数重载的原理–名字修饰 为什么C++支持函数重载,而C语言不支持函数重载呢?...return n; } 如果返回的类型变成了int&这代表着最后返回的值是n的别名而不是拷贝,当然,对于此函数栈帧销毁,n仍然存在,因为其是在静态区,不会因为栈帧的销毁而销毁,所以上面的代码也是正确的,...需要注意的是,由于编译器的版本不同,对于错误的程序其debug下的运行结果也有可能不同,底层的环境可能由于版本的更替而增加一些改变,但真正的原理不会改变; 由于我使用的是vs2019,第一次没有打印这两个地址的情况下最后打印的并不是...,但指针始终是地址空间所占字节个数(32位平台下占4个字节) 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 有多级指针,但是没有多级引用 访问实体方式不同,指针需要显式解引用,引用编译器自己处理...用示例具体解释一下: 先来看看普通的调用函数: 这样调用函数就是我们对函数栈帧了解的常识,通过符号表的地址找到函数的地址并直接进行引用。
<< endl; return 0; } 上述的代码表明,编译器会将cout解释为你定义的变量,而不是标准库中的对象,从而导致编译错误。...总结:一个函数要使用引用返回,返回变量出了这个函数的作用域还存在,就可以使用引用返回,否则就不安全 使用引用返回的好处:少创建一个拷贝的临时对象,可以提高函数的执行效率(并不是节省空间的占用) 引用和指针的区别...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 在sizeof中含义不同**:引用结果为引用类型的大小**,但指针始终是地址空间...,所占字节个数为32/64个字节 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 有多级指针,但是没有多级引用 访问实体方式不同,指针需要显式解引用,引用编译器自己处理 内联函数 以inline...查看编译器生成的汇编代码中是否存在call Add 2.在debug模式下,需要对编译器进行设置,否则不会展开,因为debug模式下,编译器默认不会对代码进行优化,这里需要自己去设置 设置方式:配置 –
这里我们需要强调的是 const_cast主要用于更改指针或引用的const或volatile限定符。其中,type_name必须是指针、引用或者成员指针类型。...在调用第三方函数中的使用 const_cast另外一种使用场景就是:在使用第三方库或API时,它们只提供了非const类型的参数的函数,但我们只有const类型的对象。如示例2所示。...2中,我们在使用第三方库和API的时候,我们只能调用,看不到其具体的实现,为了能够调用成功,需要使用const_cast来去除*ptr的const属性,来保证函数的正常调用,但是需要保证*ptr指向的对象在初始化的时候是非...例如在下面的示例3中,通过const_cast将b1的类型由volatile int*转换为 int*。...总结 综上,我们使用const_cast的原则就是: 仅当实际引用的对象/变量不是常量,才使用const_cast; 当我们调用第三方库和一些API时,它们需要使用非const形式的数据,但我们只有const
C++智能指针 零、前言 一、为什么需要智能指针 二、内存泄漏 三、智能指针 1、RAII 2、智能指针的原理 3、std::auto_ptr 4、std::unique_ptr 5、std::shared_ptr...6、std::weak_ptr 7、删除器 8、C++11和boost中智能指针的关系 零、前言 本章主要讲解学习C++中智能指针的概念及使用 一、为什么需要智能指针 示例: double Division...即我们实际上把管理一份资源的责任托管给了一个对象 好处: 不需要显式地释放资源 对象所需的资源在其生命期内始终保持有效 示例: // 使用RAII思想设计的SmartPtr类 template...,对象的引用计数减一 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了 由于资源共享...这里就需要shared_ptr设计一个删除器来解决,对于不一样的资源使用其对应的方式进行资源的回收 示例: // 仿函数的删除器 template struct FreeFunc {
---- 迭代器 在运算符上比智能指针需要重载更多运算符,处理更多功能。 有特别功能的智能指针。 主要用于遍历容器。...允许或不允许限制的条件为: 下方代码中的构造函数。(父类指针可以指向子类对象) 这样,让构造函数更有弹性 。...---- 复合下的构造与析构 构造——由内而外 析构——由外而内 ---- 继承+复合下的构造与析构 构造——由内而外 但是此时内有两个,也许在不同编译器上的实现手法不同,...析构——由外而内 同上,要注意的是,上面先构造的,会后析构。 ---- 虚指针与虚函数表(vptr & vtbl) 虚指针指向虚函数表,虚函数表中都是函数指针。...调用指针->向上转型(转为具体的子类)->调用虚函数 补充: 继承父类,函数,继承的是调用权。 父类的虚函数子类也一定要有。 父类和子类中可以出现同名的函数,但实际上不是同一个。
在这种情况下,它们返回一个空指针,其访问是未定义的行为;在最好的情况下,你的程序会崩溃。在最坏的情况下,你的程序看起来会工作一段时间,在崩溃前处理垃圾数据。...需要,并且该技术对于不是内存的资源也很有用。...使用new和delete时可能发生的一些错误是: 对象(或内存)泄漏:使用new分配对象,而忘记删除该对象。 过早删除(或悬挂引用):持有指向对象的另一个指针,删除该对象,然而还有其他指针在引用它。...这种技术包括将指针分配到在堆上分配的对象,并将其放在句柄/管理器对象中。后者具有一个析构函数,将负责销毁该对象。...在这种情况下,向量是其元素的句柄对象。 标准库中使用RAII的其他示例是std :: shared_ptr,std :: unique_ptr和std :: lock_guard。
在本文中,我将通过C ++语言的示例来说明所有多态性,并深入介绍为什么它们具有其他各种名称。 子类型多态性(运行时多态子类型多态是每个人在C ++中说“多态”时所理解的。...但是,请注意,它不适用于指针类型,因为比较指针会比较内存位置而不是内容。 为了使它适用于指针,您必须专门针对指针类型使用模板,该模板不再是参数多态性,而是ad-hoc多态性。...强制多态性(转换) 当将一个对象或原始类型强制转换为另一个对象类型或原始类型时,会发生强制转换。...使构造函数显式以避免意外转换始终是一个好主意。 同样,如果类为T类型定义了转换运算符,则可以在需要T类型的任何地方使用它。...现在,如果我们有一个以int作为参数的print_int函数,我们还可以将CrazyInt类型的对象传递给它, #include void print_int(int a) {
领取专属 10元无门槛券
手把手带您无忧上云