C++
LookAtStarSky
这个作者很懒,什么都没留下…
展开
-
默认析构函数 == 空函数?
C++默认析构函数没有任何特殊的功能 它就是一个空函数???如果是初级的C++入门书籍会告诉你,默认的构造和析构函数都是空函数,他不做任何操作。但实际情况是,严格上来说这句话是错误的。应该分情况讨论如下:一个类是Plain Old Data类型的,即该类的构造函数和析构函数都是平凡的(trivial的),若该类的默认构造/析构函数存在,则他们是空函数。如果一个类不满足POD条件,即该类是非平凡的(non-trivial的),则默认析构函数不是空函数,它将是类中非平凡的类成员变量的析构函数的合成函数原创 2020-12-02 18:15:37 · 1751 阅读 · 0 评论 -
C++学习笔记14 bind原理
C++学习笔记14bind的基本原理bind的思想实际上是一种延迟计算的思想,将可调用对象保存起来,然后在需要的时候再调用。而且这种绑定是非常灵活的,不论是普通函数、函数对象、还是成员函数都可以绑定,而且其参数可以支持占位符,比如你可以这样绑定一个二元函数auto f = bind(&func, _1, _2);,调用的时候通过f(1,2)实现调用。要实现一个bind需要解决两个问题,第一个是保存可调用对象及其形参,第二个是如何实现调用。下面来分析如何解决这两个问题。保存可调用对象实现bi原创 2020-12-02 18:04:43 · 1326 阅读 · 0 评论 -
C++学习笔记13 类型转换
C++学习笔记131. const_cast (expr)const_cast 运算符用于修改类型的 const / volatile 属性。除了 const 或 volatile 属性之外,目标类型必须与源类型相同。这种类型的转换主要是用来操作所传对象的 const 属性,可以加上 const 属性,也可以去掉 const 属性。class A { // … }; void Function() { const A *pConstObj = new A; A *原创 2020-12-02 17:54:28 · 211 阅读 · 1 评论 -
C++学习笔记12 多重继承
C++学习笔记121.多重继承多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。class D{......};class B: public D{......};class A: public D{......};class C: public B, public A{.....};上面这段代码是有问题的,C继承了A和B,因为A,B都继承D。这使得C从A和B中继承了相同的构造函数。要解决上面问题就要用虚拟继承格式格式:class 类名: virt原创 2020-12-02 17:53:24 · 162 阅读 · 0 评论 -
C++学习笔记11 命名空间
C++学习笔记111.定义命名空间命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:namespace namespace_name { // 代码声明}为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示:name::code; // code 可以是变量或函数让我们来看看命名空间如何为变量或函数等实体定义范围:实例#include <iostream>using namespace std; // 第一个命名空原创 2020-12-02 17:39:54 · 166 阅读 · 0 评论 -
C++学习笔记10 异常
C++学习笔记101.异常处理异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 ca原创 2020-12-02 17:38:29 · 403 阅读 · 0 评论 -
C++学习笔记9 模板
C++学习笔记91. 模板编译当编译器遇到一个模板定义时,它并不生成代码。只有当我们实例化出模板的一个特定版本时,编译器才会生成代码。普通的函数,函数的声明和定义我们可以放在不同文件中。对于模板则不同,为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义。因此,模板的头文件通常既有包括声明也包括定义。2. 模板函数template <typename T>int compare(const T &v1, const T &v2){ if(v1原创 2020-12-02 17:17:10 · 178 阅读 · 0 评论 -
C++学习笔记8 深拷贝和浅拷贝
C++学习笔记81. 深拷贝和浅拷贝对于带有指针的类我们才需要深拷贝和浅拷贝这个问题。/** @time: 2020/6/1* @author: mmyd*/#include<iostream>#include<cstring>using namespace std;class Str{private: char *ptr;public: Str(const char* p = 0){ if(p){原创 2020-12-02 17:16:02 · 173 阅读 · 0 评论 -
C++学习笔记7 多态与继承
C++学习笔记71. 防止继承发生class NoDerived final { }; //NoDerived不能作为基类class Base { }; //Last是final的,我们不能继承Lastclass Last final : Base { }; //Last不能作为基类class Bad : NoDerived { }; //错误: NoDerived是final的class Bad2 : Last { }; //错误: Last是final的2. 继承原创 2020-12-02 17:13:53 · 132 阅读 · 0 评论 -
C++学习笔记6 函数对象
C++学习笔记6对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。//错误: 不能为int重定义内置的运算符int operator+(int, int);1. lambda是函数对象sort(words.begin(), words.end(), [](const string &a, const string &b){ return a.size() < b.size();});class ShorterString{public:原创 2020-12-01 23:29:27 · 99 阅读 · 0 评论 -
C++学习笔记5 拷贝复制相关
C++学习笔记51. 拷贝构造函数class Com{public: Com(); //默认构造函数 Com(const Com& ); //拷贝构造函数};拷贝构造函数的参数必须是引用类型。为什么如此呢?加入不是引用类型,当我们拷贝初始化的时候,需要将实参拷贝到形参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此循环。string dots(10, '.'); //直接初始化string s(dots); //直接初始化string s2 =原创 2020-12-01 23:28:26 · 264 阅读 · 0 评论 -
C++学习笔记4 lambda && bind && 智能指针
C++学习笔记41. lambda表达式[captrue list](parameter list) -> return type {function body}我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体。默认情况下,如果一个lambda体包含return之外的任何语句,则编译器假定此lambda返回voidauto f = [] {return 42; };auto f = [i](int t) {cout<<i+t<<endl; };//指原创 2020-12-01 22:01:20 · 425 阅读 · 0 评论 -
C++学习笔记3 友元
C++学习笔记30.概述友元提供了一种 普通函数或者类成员函数 访问另一个类中的私有或保护成员 的机制。也就是说有两种形式的友元:(1)友元函数:普通函数对一个访问某个类中的私有或保护成员。(2)友元类:类A中的成员函数访问类B中的私有或保护成员优点:提高了程序的运行效率。缺点:破坏了类的封装性和数据的透明性。总结: - 能访问私有成员 - 破坏封装性 - 友元关系不可传递 - 友元关系的单向性 - 友元声明的形式及数量不受限制1.友元函数在类声明的任何区域中声明,而定义则在类的外部。f原创 2020-12-01 21:51:56 · 367 阅读 · 0 评论 -
C++学习笔记2
C++学习笔记21.Static知识点static是一个修饰符,可以修饰变量,函数。静态变量: 函数中的变量,类对象静态类的成员: 类中的变量和类中的函数静态变量对于static修饰的变量,其生命周期是整个程序的生命周期。类中的变量类中的静态变量,所有类对象共享, 使用A::a这样在类外进行初始化,构造函数不能进行初始化类中的函数类中的静态函数,我们一般使用A::fun这样进行调用,当然我们也可以使用类对象.这样调用。静态函数所有对象实例共享,不能访问非静态数据和函数。2.原创 2020-12-01 21:41:39 · 214 阅读 · 0 评论 -
C++学习笔记1
C++学习笔记11.变量声明和定义的关系为了运行把程序拆分成多个逻辑部分来编写,c++语言支持分离式编译(separate compilation)机制,该机制允许将程序分割为多个文件,每个文件可被独立编译。为了支持这种分离式编译,c++支持将声明和定义区分开来。声明:规定了变量的类型和名字,在这一点上定义与之相同。声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字必须包含对那个名字的声明。定义:定义还申请了存储空间,也可能会为变量赋一个初始值。定义(definiti原创 2020-12-01 21:30:48 · 126 阅读 · 0 评论