C++
再来一炖
这个作者很懒,什么都没留下…
展开
-
C静态变量
静态变量在第一次创建时产生,它的作用范围是整个程序,静态变量的值可以被改变(常量静态变量除外),值被改变后作用于整个程序,静态变量直到main函数结束后才被销毁,静态变量存储在数据段,不赋值时存储在.bss段,.bss段也可以看作是数据段的一部分。静态变量在main函数结束以后才销毁的原理是:程序中存在一个.finit段,该段的内容在main函数结束以后才会执行,将需要在main函数结束后才销毁的内容放在这个段可以实现。...原创 2021-09-27 23:18:56 · 285 阅读 · 0 评论 -
C++关联容器简介
关联容器支持高效的关键字查找和访问操作。两个主要的关联容器类型是map和set。map中的元素是一些关键字-值(key-value)对:关键字起到索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字;set支持高效的关键字查询操作——检查一个给定的关键字是否在set中。例如,在某些文本处理中,可以用一个set来保存想要忽略的单词。字典是一个很好的使用map例子:可以将单词作为关键字,将单词释义作为值。标椎库提供8个关联容器。这8个容器间的不同体现在三个维度上:每个容器(1)或者..原创 2021-09-02 18:59:58 · 61 阅读 · 0 评论 -
C++中static_cast、const_cast、reinterpret_cast关键字
文章目录1.static_cast2.const_cast3.reinterpret_caststatic_cat、const_cast、reinterpret_cast都是C++中用于强制类型转换的关键字,其一般格式如下:cast-name<type>(expression);1.static_cast任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。例如:int i, j;double slope = static_cast<doub原创 2021-08-26 17:11:51 · 286 阅读 · 0 评论 -
C++函数模板和类模板
文章目录1.函数模板2.在函数模板中使用多种类型3.类模板1.函数模板函数模板属于类属,它能处理不同类型的数据。当编译器遇到函数调用时,将根据实际参数的类型产生特定的代码。函数模板的定义形式是:template <类型参数表>返回值类型 函数名 (形式参数表) { //函数体}函数重载是函数名相同,当参数一定不完全相同,并且这些函数执行操作类似。采用函数重载,需要对每个函数分别写出相应的代码,如:int square(int number) { return nu原创 2021-08-23 23:01:45 · 154 阅读 · 0 评论 -
C++异常处理
文章目录1.抛出异常2.处理异常1.抛出异常例:float divide(int dividend, int divisor) { if(divisor == 0) { throw "错误:0作除数\n"; else return float(dividend) / divisor;} 其中,throw是一个关键字,它后面是一个参数,该参数可以是任意一种类型值。throw语句所在行称为异常抛出点,当程序执行throw语句之时,函原创 2021-08-23 21:35:20 · 47 阅读 · 0 评论 -
C++多重继承和多继承
文章目录多重继承多继承多重继承多重继承表示为继承链,是由若干层次的类构成。例如,如图所示的继承关系多继承如果一个子类具有两个或者多个直接父类,那么就称为多继承。例如,如下类的继承关系多继承的声明一般格式为:class <子类名> : <继承修饰符><基类名1>, <继承修饰符><基类名2>, ..., <继承修饰符><基类名n>...原创 2021-08-23 20:52:21 · 156 阅读 · 0 评论 -
指向基类的指针
指向基类对象的指针可以指向其子类的对象,当基类指针指向子类对象时,采用该指针所访问的仍然是基类中的成员。这种类型的指针具有如下特性:(1)指向基类对象的指针可以指向其子类的对象。(2)如果子类覆盖了基类中的成员,但通过基类指针所访问的成员仍然是基类成员,而不是子类成员。...原创 2021-08-23 17:58:03 · 553 阅读 · 0 评论 -
C++虚函数、纯虚函数和抽象类
文章目录1.虚函数2.纯虚函数3.抽象类1.虚函数虚函数是类中的一个函数成员,与其它函数成员的唯一区别是在子类中覆盖它。声明虚函数的方法很简单,只要在需要声明为虚函数的函数成员返回值类型之前加上virtual关键字。如:class A {private: int a;public: virtual void setA(int n) { //虚函数,需要在子类中将其覆盖 a = n; }};对于虚函数,编译器完成的是动态连编,即对函数的调用是在运行原创 2021-08-23 16:42:43 · 150 阅读 · 0 评论 -
C++基类和子类的构造函数的调用
文章目录基类和子类构造函数和析构函数的调用向基类的构造函数传参数基类和子类构造函数和析构函数的调用当基类和子类都有构造函数时,如果定义了一个子类对象,那么首先要调用基类的构造函数,然后再调用子类的构造函数;析构函数的调用次序与此相反,即先调用子类的析构函数,再调用基类的构造函数。向基类的构造函数传参数基类和子类如果都使用了默认的(缺省)构造函数,它们的调用是自动完成的,这是一种隐式的调用。但如果基类的构造函数带有参数,或者基类有多个构造函数,那么调用的方法是让子类的构造函数显示的调用基类的构造函数,原创 2021-08-23 14:05:13 · 3480 阅读 · 0 评论 -
C++类的继承
文章目录1.继承的定义2.保护成员和类的访问1.继承的定义C++允许在当前类的基础上构造新类,这样,就继承了当前类的所有数据成员和函数成员(构造函数和析构函数除外)。继承是OOP程序设计中很重要的一个方面,继承易于扩充现有类已满足新的应用。通常将已有的类称为父类,也称为基类,将新产生的类称为子类,也称为导出类或派生类。如:class A {private: int a; void a2();public: void a1(int);};class B : public原创 2021-08-23 11:00:04 · 506 阅读 · 0 评论 -
C++this指针
this是一个隐含的内嵌指针,在函数成员中频繁出现,它指向的是调用该成员函数的当前对象。原创 2021-08-22 23:04:20 · 62 阅读 · 0 评论 -
C++对象赋值和类的拷贝构造函数
文章目录1.对象赋值问题2.拷贝构造函数3.调用拷贝构造函数的情况1.对象赋值问题采用赋值运算符=可以将一个对象赋值给另一个对象,或者采用一个对象初始化另一个对象。在默认情况下,该操作执行的是对象成员之间的复制,也称为按位复制或浅复制。当采用一个对象初始化另一个对象时,对象成员之间的赋值也是按位复制,即将一个的数据成员按在内存中存储形式(二进制位),直接复制给给另一个对象。如:class A { private: int a; public: voi原创 2021-08-22 22:59:55 · 1614 阅读 · 0 评论 -
C++友元函数
友元函数不是类中的函数成员,但它可以访问类的私有成员。类的私有成员对于类外语句是隐藏的,如果要访问它们,必须调用公有函数成员。但友元函数可以打破这个限制,友元函数和类的函数成员一样,可以访问类的私有成员。友元函数既可以是一个外部函数,也可以是另外一个类的函数成员。讲一个函数声明为一个类的友元方式很简单,只要将关键字friend放在函数原型之前就可以friend <返回值类型> <函数名>(形式参数)如:class A {private: ...public.原创 2021-08-22 17:23:39 · 83 阅读 · 0 评论 -
C++静态成员
文章目录1.静态数据成员2.静态函数成员1.静态数据成员静态数据成员 是类中的一个成员,定义时前面有static关键字修饰它的特点是(1)同一个类中的所有对象都共享该变量。如果类的一个对象改变了静态数据成员的值,那么该类的所有对象的该静态数据成员的值都将改变。(2)静态变量不依赖对象而存在,无论是否定义该类的对象,这种类型的变量都存在。class StaticDemo {private: static int x; //说明静态的数据成员 int y;public:原创 2021-08-22 15:56:53 · 124 阅读 · 0 评论 -
C++中的内联函数、构造函数、析构函数等
文章目录内联函数构造函数析构函数带参构造函数内联函数**所谓的内联函数就是那些完整地定义在类内部的函数成员。**若函数成员的代码比较少,那么把它的定义写在类的声明中,此时的函数就是内联函数成员。如:class Rectangle{ private: float width; float length; float area; public: void calculateArea() {area = width * len原创 2021-08-19 15:19:53 · 1186 阅读 · 0 评论 -
类的多文件组织
在C++程序设计中,习惯于将类的定义、类函数成员的实现,以及应用程序分别放在3个文件中,通常以下列方法组织程序:(1)将类的定义存储在头文件中。包含定义的头文件称为类的声明文件,通常该文件的文件名和类名相同,扩展名为.h。例如,将Rectangle类的定义放在Rectangle.h文件中。//Rectangle.h文件的内容#ifndef RECTANGLE_H#define RECTANGLE_Hclass Rectangle{ private: float wid原创 2021-08-19 12:41:15 · 686 阅读 · 0 评论 -
类的基本概念
文章目录1.类的定义2.定义函数成员3.定义对象4.访问对象成员1.类的定义类是C++中创建对象的基础,它与C的结构体类似,是程序员自定义的一种由变量和函数构成的抽象数据类型,定义的一般形式为:class 类名{ 变量和函数的声明; ...};在默认情况下,类中的成员(包括数据成员和函数成员)都是私有的,类外的程序不能访问类中的私有成员。C++提供修饰成员的3个关键字:private(私有)、public(公有)和protected(保护)。如:class Rectangle原创 2021-08-19 10:12:21 · 917 阅读 · 0 评论 -
C++:new和delete操作符
C++内存的动态分配和释放C++提供的new和delete操作符可以实现内存的动态分配和释放,同时也可以使用C的函数malloc与free实现。1.new采用new动态分配内存形式如下:int *iptr1, *iptr2;iptr1 = new int;iptr2 = new int(30);如果内存空间分配失败,new将返回0或NULL,两者一样,NULL是定义在iostream中的常量,实际就是0,采用如下方式检验内存分配是否失败if (iptr1 == NULL){ cou原创 2021-08-17 21:43:27 · 83 阅读 · 0 评论 -
函数的重载
函数重载就是定义多个函数,它们的名字相同,但是参数的类型或参数的个数不全相同。许多程序设计语言都规定函数名不能重复,但C++允许函数重载,可以给函数取相同的名字,只要它们的参数列表不全相同。如:int sum(int num1, int num2);int sum(int num1, int num2, int num3);注意,不能采用函数返回值的类型来区别函数的重载。...原创 2021-08-17 21:14:51 · 54 阅读 · 0 评论 -
函数实参和形参
形参(形式参数)在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。实参(实际参数)函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。形参和实参的区别和联系形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。实参可以是常量、变量、表达式、函数等,无转载 2021-08-17 18:42:35 · 807 阅读 · 0 评论 -
C++函数的默认参数
C++支持默认参数,如果在函数调用时省略了函数实参,将把参数的默认值赋给函数形参。默认值得设定要在函数最早出现的地方,通常是在函数原型中给出,没有函数原型,则在函数定义时给出。void showArea(float length = 20.0, float width = 10.0){ float area = length * width; cout << area;}调用函数showArea();此时,函数实参全部省略。在函数调用时,如果函数的一个参数用默认原创 2021-08-17 18:22:47 · 236 阅读 · 0 评论 -
cin、cin.getline、cin.get、cin.ignore等格式化输入
文章目录1.cin.width2.cin.getline3.读取一个字符4.cin.ignore1.cin.widthchar word[5];cin.width(5);cin >> word;上面的程序,cin只读取4个字符到字符数组,最后一个字符为"\0"自动添加。cin.width指定了输入域宽,上面程序指定输入域宽为5。cin >> setw(5) >> word;与上面程序效果一样。域宽只对与其相邻的下一个输入有效。当cin遇到空字符时它原创 2021-08-17 17:42:53 · 1358 阅读 · 0 评论 -
stew、setprecision、setiosflags等C++格式化输出
文章目录1.setw2.setprecision3.setiosflags4.采用成员函数实现格式化输出setw、setprecision、setiosflags都需要包含头文件#include<iomanip>1.setwsetw操作符为每个输入数据指定宽度。int value = 68;cout << "(" << setw(5) << value << ")" << endl;输出( 68)输出为将在6原创 2021-08-17 17:02:42 · 1835 阅读 · 0 评论 -
三元组矩阵的基本操作——加、减、矩阵乘、转置
#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef int ElemType, Status;#define MAXSIZE 256typedef struct{ int i, j; //数据所在的行、列值 ElemType v; //数据元素值}Triple;typedef struct{ Triple arr[MAXSIZE]; //非零元原创 2021-08-14 16:43:14 · 1550 阅读 · 2 评论 -
三元组矩阵转置
1.简单方法:把三元组表中行与列内容互换,然后再按行号对新的三元组表中的各三元组从小到大进行排序,就可以得到转置后的三元组表,如果排序操作是经典排序,则时间复杂度为O(Nums*Nums)2.列序遍历法:其思想是按照转置后的三元组顺序,在转置前三元组中找到相应的三元组进行转置。根据转制后的三元组的行序,首先在转之前的三元组中找到行号为0的三元组,...原创 2021-08-14 16:36:52 · 2540 阅读 · 0 评论 -
C++:auto类型说明符、decltype类型指示符
编程时常常需要把表达式的值赋给变量,这就要求在声明变量时清楚的知道表达式的类型。然而要做到并非那么容易,有时根本做不到。为了解决这个问题,C++11新标准引入了auto说明符,用它就可以让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符不同,auto让编译器通过初始值来推算变量类型。auto定义的变量必须有初始值:auto item = va1 + va2; //item初始化为va1和va2相加的结果有时会遇到这种情况:希望从表达式的类型推断出要定义的变量类型,但.原创 2021-07-15 14:58:20 · 189 阅读 · 0 评论 -
C++:类型别名typedef、using
类型别名是一个名字,它是某种类型的同义词。使用类型别名的好处很多,它让复杂类型名字变得简单明了、易于理解和使用,还有助于程序员清楚的直到使改类型的目的。有两种方法可以用于定义类别名。传统的方法是使用关键字typedef:typedef double wages; //wages是double的同义词typedef wages base, *p; //base是double的同义词,p是double*的同义词wages hourly; //等价于double hourly.原创 2021-07-15 14:14:51 · 239 阅读 · 0 评论 -
C++:constexpr
常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。一个对象是不是常量表达式由它的数据类型和初始值共同决定const int max = 20; //max是常量表达式const int limit = max + 1; //limit是常量表达式int staff_size = 27; //staff_size不是常量表达式const int .原创 2021-07-15 12:39:15 · 148 阅读 · 0 评论 -
C++头文件
类可以定义在函数体内,但这样的类毕竟受到一些限制。所以,类一般都不定义在函数体内。当在函数体外定义,在各个指定的源文件中可能只有一处该类的定义。而且,如果要在不同文件中使用同一个类,类的定义就必须保持一致。为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在的头文件名应该和类名一致。例如:库类型string在名为string的头文件中定义。头文件通常包含那些只能被定义一次的实体,如类、const和consetexpr变量等。头文件也经常用到其他头文件的功能。例如,一个Sales_dat.原创 2021-07-15 11:07:15 · 342 阅读 · 0 评论 -
C++顶层const和底层const
指针本身是一个对象,它又可以指向另一个对象,因此,指针是不是常量以及指针所指的对象是不是一个常量是两个独立的问题。顶层const表示指针本身是一个常量,不能改变,不能指向其他对象。底层const表示指针所指的对象是一个常量,该对象的值不能改变。更一般的,顶层const可以表示任意的对象是常量,对任何的数据类型都适用。底层const则与指针和引用等复合类型的基本类型有关。例如:int i = 0;int *const p1 = &i; //不能改变p1的值,是一个顶层constco.原创 2021-07-14 22:23:34 · 209 阅读 · 0 评论 -
引用与指针的区别
引用是为对象起了另外一个名字,引用类型引用另外一种类型。通过==&变量名==来定义引用类型。如:int ival = 1024;int &refVal = ival; //relfVal指向ival,是ival的另一个名字int &refVal12; //报错,引用必须初始化引用在内部其实是用指针来实现,所以引用的内存大小和指针一样。引用一旦初始化完成就不能和重新绑定到其他对象,不能建立数组引用。...原创 2021-07-11 14:08:37 · 71 阅读 · 0 评论