随笔分类 -  C++

摘要:模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。 函数模板: 格式如下: template <typename 类型参数1, typename 类型参数2, ...> 返回类型 函数名(形参表) { // 函数定义 } #inc 阅读全文
posted @ 2023-09-13 16:56 jason8826 阅读(73) 评论(0) 推荐(0)
摘要:默认命名空间默认命名空间又叫全局命名空间。典型的默认命名空间就是main函数,函数或变量没有放在其他的命名空间中,编译器会把它们归类到一起组成一个命名空间。假如我们的程序一个namespace都没有定义,那么所有的变量和函数都在一个空间内。就是我们c中的普通编程。 默认命名空间引用要在一个命名空间内 阅读全文
posted @ 2023-08-01 18:58 jason8826 阅读(55) 评论(0) 推荐(0)
摘要:typeid 运算符用来获取一个表达式的类型信息。ypeid 会把获取到的类型信息保存到一个 type_info 类型的对象里面,并返回该对象的常引用;当需要具体的类型信息时,可以通过成员函数来提取。 格式如下: typeid(数据类型) 或 typeid(表达式) type_info类的几个成员函 阅读全文
posted @ 2023-07-21 17:21 jason8826 阅读(68) 评论(0) 推荐(0)
摘要:想要在基类中定义虚函数实现多态,但是有不希望这个基类可以实例化,可以将虚函数定义为纯虚函数。 格式如下: virtual 返回值类型 函数名() = 0; 例: virtual int fun() = 0; 纯虚函数的特性: 1.包含纯虚函数的类称为抽象类。之所以说它抽象,是因为它无法实例化,也就是 阅读全文
posted @ 2023-07-11 14:50 jason8826 阅读(39) 评论(0) 推荐(0)
摘要:基类的析构函数为什么要定义为虚函数?基类指针指向派生类对象实现多态,如果基类的析构函数没有定义成虚函数,在删除基类的指针时,只会调用基类析构函数,而不会调用派生类的析构函数,那么派生类的成员就得不到释放,内存释放不完全导致内存泄露。 #include <iostream> using namespa 阅读全文
posted @ 2023-07-11 10:55 jason8826 阅读(32) 评论(0) 推荐(0)
摘要:C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。 一般的用法,就是拿一个父类的指针去调用子类中被重写的方法。 多态的特性:1.必 阅读全文
posted @ 2023-07-03 22:45 jason8826 阅读(35) 评论(0) 推荐(0)
摘要:类其实也是一种数据类型,也可以发生数据类型转换,不过这种转换只有在基类和派生类之间才有意义,并且只能将派生类赋值给基类。派生类对象赋值给基类对象、将派生类指针赋值给基类指针、将派生类引用赋值给基类引用,这在 C++ 中称为向上转型(Upcasting)。反之,将基类赋值给派生类称为向下转型(Down 阅读全文
posted @ 2023-06-15 11:01 jason8826 阅读(25) 评论(0) 推荐(0)
摘要:为了解决多继承时的命名冲突问题,C++ 提出了虚继承。虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。这个被共享的基类就称为虚基类。 虚继承的使用: 格式: 在继承方式前面加上 virtual 关键字就是虚继承 #include <iostream> using namespace std; 阅读全文
posted @ 2023-06-08 15:56 jason8826 阅读(64) 评论(0) 推荐(0)
摘要:子类和父类(基类和派生类) 派生的四个步骤:1.继承基类成员:除构造函数与析构函数外全部继承。2.改造基类成员:同名的成员变量和成员函数就会造成覆盖(遮蔽),父类和子类成员函数是不会构成重载的。此时基类的成员仍可以被访问,只要加上类名和域解析符。例:派生类对象.基类名::成员函数;3.发展新成员4. 阅读全文
posted @ 2023-06-06 23:10 jason8826 阅读(37) 评论(0) 推荐(0)
摘要:引用 不是新定义一个变量,而 是给已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用的特性:1.在定义时必须初始化,之后不可更改。2.引用不可以为NULL。3.一个变量可以有多个引用。 引用的使用: 格式如下: 类型 &引用变量名 = 引用实体; 阅读全文
posted @ 2023-05-31 15:50 jason8826 阅读(94) 评论(0) 推荐(0)
摘要:转载:https://blog.csdn.net/TwoTon/article/details/124475088 引用传递,只是明面上,没有使用值传递,值传递本身是不可避免的。编译器,暗地里通过指针(或者其他可以替代指针的数据类型)的值传递,替换了引用传递。所以引用传递,实质上是地址传递,别名这东 阅读全文
posted @ 2023-05-30 19:03 jason8826 阅读(113) 评论(0) 推荐(0)
摘要:友元函数的特性:1.首先它是不属于这个类的函数,它可以是全局函数,也可以是另外一个类的成员函数。2.定义放在类中和类外没有区别。3.声明放在类的 public 和 private 没有区别。4.友元函数不属于类,所以没有this指针。5.友元函数不能被继承。 友元函数的作用:1.可以直接访问类的私有 阅读全文
posted @ 2023-05-21 17:11 jason8826 阅读(118) 评论(0) 推荐(0)
摘要:const成员变量的特性:1.初始化 const 成员变量只有一种方法,就是通过参数初始化表。 格式: const int num; const成员函数的特性:1.可以访问成员变量,但不能修改成员变量。2.不能调用非const成员函数,因为成员函数可以修改成员变量的值。 格式: void fun() 阅读全文
posted @ 2023-05-18 16:21 jason8826 阅读(89) 评论(0) 推荐(0)
摘要:静态成员变量的特性:1.属于类,不属于某个具体对象,因此不创建对象也可以访问。2.内存分配在静态区,所有对象共用这份内存,到程序结束时才释放。 静态成员变量的定义(初始化):1.初始化格式 type class::name = value;2.需要在类的外部且在代码块之外定义。3.private的静 阅读全文
posted @ 2023-05-18 12:28 jason8826 阅读(79) 评论(0) 推荐(0)
摘要:this是C++的一个关键字,本质是指向创建的对象的地址 this指针的特性:1.this指针是const指针,它的值不能被修改。2.只能在成员函数内部使用。3.只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用。 this指针的作用:1.用来区分成员变量和形参 #in 阅读全文
posted @ 2023-05-16 16:26 jason8826 阅读(24) 评论(0) 推荐(0)
摘要:构造函数的特性:1.名字和类名相同。2.需要声明为 public 属性。否则创建对象时无法被调用。3.没有返回值。函数体中不能有 return 语句,不管是声明还是定义函数名前都不能出现返回值类型,即使是 void 也不允许。4.系统在创建对象时自动调用,不需要用户显式调用(用户也不能调用,会报错) 阅读全文
posted @ 2023-05-12 16:59 jason8826 阅读(61) 评论(0) 推荐(0)
摘要:1.类的成员函数默认就是内联函数,类外定义的成员函数需要加上 inline 关键字。2.如果既不写 private 也不写 public,就默认为 private。 阅读全文
posted @ 2023-05-12 15:34 jason8826 阅读(19) 评论(0) 推荐(0)
摘要:为什么会有内联函数?1.函数调用:需要实参、局部变量等数据入栈;2.然后执行函数体的代码;2.执行完数据出栈。如果函数只有很少的语句,频繁调用的话,时间都浪费在入栈和出栈上。因此,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数 阅读全文
posted @ 2023-05-11 16:13 jason8826 阅读(35) 评论(0) 推荐(0)
摘要:函数的重载的规则:1.函数名称必须相同。2.参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。3.函数的返回类型可以相同也可以不相同。!!!仅仅返回类型不同不足以成为函数的重载。 void fun(char a) { cout << a << endl; } void fun(double 阅读全文
posted @ 2023-05-11 15:32 jason8826 阅读(73) 评论(0) 推荐(0)
摘要:函数的默认参数,指的是当函数调用中省略了实参时自动使用的一个值,这个值就是给形参指定的默认值 void fun(int a = 10) { cout << a << endl; } // void func(int a, int b =10) // 可行 // void func(int a = 1 阅读全文
posted @ 2023-05-11 15:08 jason8826 阅读(118) 评论(0) 推荐(0)