C++
文章平均质量分 67
C++学习记录
cczu_chan
如无必要 勿增实体
展开
-
C++ 模板实参中的参数可以省略的情况分析
先来看一道C++二级真题+未来教育解析:关于在调用模板函数时模板实参的使用,下列表述中正确的是()。A)对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B)对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C)对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D)对于常规参数所对应的模板实参,任何情况下都不能省略...原创 2019-03-29 16:49:36 · 5427 阅读 · 0 评论 -
C++ 【常/非常变量地址赋给常/非常指针】暨【常/非常变量值赋给常/非常变量】8种情况对错分析
常/非常变量地址赋给常/非常指针正确: A. int a, *p = &a; B. int a; const int *p = &a; C. const int a; const int *p = &a;错误: D. const int a; int *p = &a;总结:对于把变量地址赋值给指针的情况,普通变量地址可以赋给普通指针/常指针,常变量...原创 2019-02-23 15:06:48 · 389 阅读 · 0 评论 -
C++ 【类名 &函数名(){ }】与【类名 函数名(){ }】return内容的分析
//1Point &element(int index) { ...................... return points[index];//2Point &element(int index) { ...................... return points[index]; 假设两个类Point和ArrayOfPoints,po原创 2019-02-22 17:31:14 · 9541 阅读 · 2 评论 -
C++【指向数组的指针】和【数组指针】详细分析
指向数组的指针:char *p = new char;定义指向动态分配的字符变量的指针;char *p = new char[3];定义指向动态分配的一维字符数组的指针,p指向数组首个元素的地址,即(p+1)为数组第二个元素的地址;char (*p)[3] = new char[3];定义指向动态分配的二维字符数组(三行)的指针,p指向数组首行的地址,即(p+1)为数组第二行的地址;cha...原创 2019-02-22 15:15:52 · 1165 阅读 · 0 评论 -
C++ “复制构造”比“先构造,后赋值”更加高效
题目Student为表示学生的类且未重载赋值操作符,则下述程序中有调用复制构造函数的是://程序 aint main() { Student t1; Student t2(t1); //1 Student t3 = t1; //2 return 0;}//程序 bint main() { Student t1; Student t2(t1); //1 St...原创 2019-02-17 16:18:49 · 919 阅读 · 0 评论 -
C++ 构造函数的类内实现、类外实现
以钟表类为例;类内声明构造函数,类外实现构造函数类内声明并实现构造函数注意1. 图中的Clock() :Clock(0, 0, 0){ }是委托构造函数,其中的Clock(0, 0, 0)为调用另外的构造函数...原创 2019-02-16 17:22:20 · 10647 阅读 · 2 评论 -
【C++面向对象】类的静态数据成员(static修饰)和常数据成员(const修饰)的初始化
类的常数据成员(由const修饰)必须在构造函数的初始化列表里被初始化,不能在构造函数的函数体中被赋值;又因为构造函数可以在类内或类外实现,所以表面上看,常数据成员可在类内初始化,也可在类外初始化。如:常数据成员在类外初始化class A{ public: A(int i);//构造函数 private: const int a; ...原创 2019-01-11 16:45:57 · 963 阅读 · 0 评论 -
【C++类和对象】计算两点间距离的两种方法
使用类的组合(线段Line类中包含点Point类成员):#include <iostream>#include <cmath>using namespace std;//Point类的定义class Point {public: Point(int xx = 0, int yy = 0) {//构造函数定义了,类外无需实现 x = xx; y =...原创 2019-01-10 20:49:10 · 8412 阅读 · 0 评论 -
【C++二级易错题整理】历年真题及最新大纲模拟题之C++篇(二)(零基础,选择题也能35+)
写在最前 在我的上一篇博文:“公共基础知识篇(一)”中,根据历年真题及最新大纲模拟题,个人整理了一些公共基础知识部分的易错题。本文继续介绍C++二级考试选择题部分的“重头戏”,分数值占到选择题总分75%的C++知识部分。文章目录重载、重载运算符重载类型转换运算符常对象、常数据成员、常成员函数常数据成员常对象常成员函数内联函数初始化指针this指针输入输出流模板栈、队列线性表排序面向对象其它非...原创 2019-03-30 20:13:22 · 6440 阅读 · 1 评论 -
C++ “顺序队列、循环队列、带链队列”队空队满时,队头队尾指针的情况分析
顺序队列的三种状态 1. 队空qu.front == qu.rear 如图所示,当顺序队列队空时,队头指针front和队尾指针rear相同;注意front和rear不是真正的指针,而是int型变量,代表元素下标。 注:随着出队入队的操作,当出现队空状态时,队头队尾指针不一定指向第一个元素。 2. 队满qu.front == 0;qu.rear == max+1 3. ...原创 2019-03-26 20:44:54 · 7970 阅读 · 0 评论 -
C++ 不能通过给字符数组名赋值的方法给字符数组赋值
已知有数组定义:char a[3][4];形如:“a[0] = “AAA”;”的赋值语句是错误的,因为在C++中,无法通过给字符数组名赋值来实现给字符数组每一个元素赋值。正确的赋值方法应该是:通过for循环来赋值#include<iostream>using namespace std;int main(){ char a[3][4]; char *p="AAA"...原创 2019-03-30 21:49:09 · 3382 阅读 · 2 评论 -
【C++】 常对象、常数据成员、常成员函数总结
常数据成员 ◆ 常数据成员必须进行初始化,并且不能被更新。 ◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始化均可。 ◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。)常对象 ◆ ⭐常对象可以调用常成员函...原创 2019-03-24 15:07:25 · 9248 阅读 · 5 评论 -
C++ “类名 对象1=对象2;”与“类名 对象1(对象2);”的构造方法是一致的
看代码:#include<iostream>using namespace std;class TV{public: TV(int s=41): size(s){} TV(const TV &r): size(r.size){ cout<<1;} ~TV(){}private: int size;};TV fun(TV &u){...原创 2019-03-31 20:32:56 · 709 阅读 · 0 评论 -
【C++11新标准】 类的构造函数的个数到底包含不包含默认构造函数?
写在最前 最近在用淘宝上买的《未来教育》模拟考试软件刷C++二级的真题,遇到有一条颇有争议的题目,根据C++11新标准,题目的答案是有问题的,下面来解析一下。原题: 有如下类定义: class MyClass{ int value; public: MyClass(int n):value(n) { } int getValue() c...原创 2019-03-27 23:36:16 · 1575 阅读 · 0 评论 -
C++ 不同类型变量进行运算时的类型转换总结
int型乘以double型,结果是double型自动转换遵循以下规则:若参与运算量的类型不同,则先转换成同一类型,然后进行运算。转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。a.若两种类型的字节数不同,转换成字节数高的类型b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型所有的浮点运算都是以...原创 2019-03-27 21:52:08 · 10767 阅读 · 2 评论 -
C++ 编译器是否隐含生成默认构造函数和默认复制构造函数的4种情况讨论
① 类内有自定义构造函数和自定义复制构造函数 根据C++标准定义,如果程序已定义构造函数,默认情况下编译器就不再隐含生成默认构造函数。注意,这里的“构造函数”包括复制构造函数(因为复制构造函数也是构造函数的一种)。 此时该类一共有2个构造函数:自定义构造函数和自定义复制构造函数。② 类内有自定义构造函数,无任何复制构造函数 根据C++标准定义,有自定义构造函数,则无默认构造函数;无自...原创 2019-03-28 19:04:36 · 3258 阅读 · 0 评论 -
【C++】引用可以指向临时无名对象吗?
先来看一道C++二级真题有如下类定义:class MyClass{ public:MyClass(int d=0): val(d) { } ____________ //运算符函数+的声明private: int val;};若要使语句序列MyClass x(2), y(4), z;z=7+y;y=x+3;能够正常运行,横线处的声明语句应为()。A) frien...原创 2019-03-28 20:29:38 · 951 阅读 · 2 评论 -
C++ 编译器调用“复制构造函数”或“移动构造函数”时的自动选择分析
众所周知,当类的对象作为函数返回值的时候,函数会调用类的复制构造函数或移动构造函数,来构造一个临时无名对象返回主函数中。当一个类中既有复制构造函数,又有移动构造函数的时候,函数在返回时,编译器调用的是复制构造函数还是移动构造函数?调用的依据又是什么?首先来看一个例子#include&amp;amp;amp;lt;iostream&amp;amp;amp;gt;using namespace std;class IntNum{priv...原创 2019-02-23 20:01:32 · 590 阅读 · 1 评论 -
【C++】派生类定义复制构造函数怎么传、传什么初始化参数给它的基类们?
【C++】派生类定义复制构造函数怎么传、传什么初始化参数给它的基类们? 若派生类定义复制构造函数,一般都要为基类的复制构造函数传递参数,但是复制构造函数的形参表里只能有一个参数,那么这个问题怎么解决呢?解决的关键就是,已有的派生类的对象的引用,可以作为实参,传给任意一个基类的复制构造函数,例如如下的派生类的复制构造函数:C::C(const C &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;c1): B(c1),D(c1),....原创 2019-02-25 19:43:51 · 1131 阅读 · 0 评论 -
【C++二级易错题整理】历年真题及最新大纲模拟题之公共基础知识篇(一)(零基础,选择题也能35+)
写在最前 C++二级大纲规定:单项选择题40分(含公共基础知识部分10分)。而且按照最新的计算机等级考试规定:自2019年3月起,凡选择题部分得分低于20分,则直接按不合格处理。所以考生应当提高对选择题部分的重视。 而选择题中,往往出错率最高的就是公共基础知识部分,因为大部分考生把所有精力都用来复习C++,但是公共基础知识繁杂庞多,想复习也无从下手,所以很多人直接放弃公共基础知识部分的10...原创 2019-03-30 16:25:09 · 1647 阅读 · 0 评论 -
C++ 复制构造函数被调用的三种情况
定义看起来干巴巴的,举一个湿乎乎的例子: 全局函数:void fun1(Point p){ }; Point fun2(){Point c; return c;}; 主调(main)函数:Point a, b(a); fun1(a); b = fun2(); 【解析】用对象a初始化对象b,调用复制构造函数;对象a做实参与fun1的形参作形实结合生成fun1的局部对象p,调用复制构造函...原创 2019-03-22 19:45:53 · 834 阅读 · 0 评论 -
【一图搞懂】C++ 指针常量、指向常量的指针、常变量定义时是否需要初始化
原创 2019-03-22 15:44:01 · 1393 阅读 · 2 评论 -
C++ 指向动态分配的指针数组的指针
首先介绍指向数组的指针: char *p = new char; 定义指向动态分配的字符变量的指针; char *p = new char[3]; 定义指向动态分配的一维字符数组的指针,p指向数组首个元素的地址,即(p+1)为数组第二个元素的地址; char (*p)[3] = new char[2][3]; 定义指向动态分配的二维字符数组(三行)的指针,p指向数组首行的地址,即(p+...原创 2019-03-16 21:03:07 · 8305 阅读 · 1 评论 -
C++ 一图搞懂“从栈底往栈顶压、从栈顶往栈底压”两种情况
设栈的存储空间为S(1:m),表示栈内存储m个元素 通常情况,栈都是从栈底往栈顶压,初始状态栈顶指针top=0(栈空)。当top=m+1,栈满;当top=23,栈内有23个元素。 当从栈顶往栈底压时,初始状态栈顶指针top=m+1(栈空)。当top=0,栈满;当top=23,栈内有(m+1-23)个元素。...原创 2019-03-16 20:20:01 · 10821 阅读 · 3 评论 -
C++ 赋值运算符能重载为类外非成员函数吗?
下列是重载为非成员函数的运算符函数原型,其中错误的是( )。 A.Fraction operator +(Fraction, Fraction); B.Fraction operator -(Fraction); C.Fraction& operator =(Fraction&, Fraction); D.Fraction& operator +=(Fracti...原创 2019-03-16 15:07:25 · 3438 阅读 · 2 评论 -
C++ 映射map的三种insert插入方式
构建一个映射,并插入一个二元组。方法1:map<int, int> maps;maps.insert(pair<int, int> (10, 15));方法2:map<int, int> maps;maps.insert(make_pair(10, 15));方法3:map<int, int> maps;typedef pa...原创 2019-03-11 16:18:36 · 26696 阅读 · 1 评论 -
C++ 容器适配器——栈(stack)和队列(queue)都不支持迭代器
对于queue<int> q; 在q.push(10); 后,以下能正确返回TRUE的是:(多选题) A. q.front() == *q.begin(); B. q.front() == q.back(); C. q.emplace(20), q.back() == 20;答案:解析:A选项,容器适配器——队列queue没有成员begin和end(因为栈和队列不支持迭代器,不...原创 2019-03-11 15:17:51 · 4984 阅读 · 0 评论 -
C++ 在函数对象参数只能是一元谓词的情况下,如何使用二元谓词
C++STL库中的find_if的第三个参数只能是一元谓词(即只能传给一元谓词一个参数),但是在设计算法的过程中,需要第三个参数是二元谓词(即需要传给谓词函数两个参数),那么这时候就可以使用bind1st/bind2nd函数适配器,将二元谓词的某一个参数绑定为一个常数,这样二元谓词就变成了一元谓词,find_if只需要传给二元谓词一个参数就也能正常使用。 例如://找到数组中第一个大于4...原创 2019-03-09 22:45:06 · 547 阅读 · 0 评论 -
C++ for循环语句使用前置++和后置++有何区别?
在for循环中中几乎没有区别,因为它的执行顺序for(partA; partB; partC)首先执行partA然后每次循环之前执行partB每次循环之后执行partC唯一的区别就是在某些情况下效率不同对于基本数据类型,前置/后置++执行效率应该一样对于对于用户自定义类型重载的++如最常见的iterator则++i效率要高一些当然也不是绝对的如果你用的是支持随机存储的容器如vect...原创 2019-03-07 14:55:41 · 2961 阅读 · 0 评论 -
C++ list列表容器的每相邻两个元素顺序颠倒
list&lt;int&gt; l;for (int i = 0; i &lt; 10; i++) { int x; cin &gt;&gt; x; l.push_front(x);}//将列表容器l的每相邻两个元素顺序颠倒list&lt;int&gt;::iterator iter = l.begin();/*l.begin()返回的是指向l首元素地址的迭代器并将其赋值给iter原创 2019-03-07 13:56:22 · 787 阅读 · 1 评论 -
C++ 动态数组类模板中,为什么重载了指针转换运算符T *之后,还要重载下标运算符[ ]?
重置指针转换运算符函数的声明:operator T *();operator const T *() const;/*后置const是为了让常对象能调用这个成员函数(常对象只能调用常成员函数,不能调用普通成员函数); “const T*”表示,通过对象名创建动态数组后,通过对象名不能改变数组*/ 假设动态数组类模板Array,假...原创 2019-03-04 11:23:09 · 1838 阅读 · 1 评论 -
C++ 为什么要使用继承?为什么要使用动态绑定?为什么要使用虚函数?
继承和动态绑定对程序的编写有两方面的影响: 使用继承,我们可以更容易地定义与其他类相似但不完全相同的新类; 使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。——————————————————————————————————————————— 通过使用动态绑定,我们能用同一段代码分别处理基类和派生类们的对象。在C++语言中,当我们使用基类的引用(或指针...原创 2019-03-02 16:55:32 · 1054 阅读 · 0 评论 -
【C++】有无virtual关键字的区别
假设有基类Base,基类的公有派生类Derived,全局函数fun; fun函数和主函数的代码为:void fun(Base* b) { delete b;}int main() { Base *b = new Derived(); fun(b); return 0;} 虽然我们定义b为指向基类对象的指针,但是这里用b指向动态分配的派生类对象也是可行的,接着就是执行fu...原创 2019-02-28 23:15:37 · 914 阅读 · 0 评论 -
C++ 运算符重载为类的成员函数或类外非成员函数的实用查看表格
原创 2019-02-28 14:20:02 · 1029 阅读 · 0 评论 -
【C++】protected继承和private继承没有区别,一毛一样 ;protected成员和private成员有且仅有一点不同
不同的继承方式的影响主要体现在:在派生类内部,派生类里的非基类成员怎么去访问从基类继承过来的成员?在派生类外部(派生类的对象),怎么去访问从基类继承过来的成员?不同的继承方式:public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public(类内:可访问(直接访问);类外:可访问(直接访问)),protected(类内:可...原创 2019-02-27 15:48:55 · 652 阅读 · 0 评论 -
【烤机向】美国大选有没有打成269票平局的情况?
美国大选到最后阶段,往往都是两个人的角逐,比如上一次的希拉里和川普。大选的规则是只要一个候选人在一个州获胜,那么这个州的所有选票就划归在本州获胜的候选人。从上图可以看出,每个州的选票数量是不一样的,如加利福尼亚州有多达55张选票,最少的州只有3张选票,所有51个选取的总票数是538。 那么问题来了,有没有两个候选人均获得269票打成平局的情况?在数据结构上讲,该问题的复杂度是O(2^5...原创 2019-04-08 10:38:38 · 6465 阅读 · 2 评论