![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 69
tianya_team
关注抖音号:天天coding,免费获得源码以及技术指导。
展开
-
虚继承和虚基类
问题描述:如果A继承B和 C,而B和C继承D,则A将D继承了两次。或者A继承B和C,但是B和C中都有一个print函数。默认情况下,如果某个类在派生过程中出现了多次,则派生类中将包含该类的多个子对象。虚基类:为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数原创 2016-03-02 10:12:22 · 604 阅读 · 0 评论 -
类的静态成员
类的静态成员与类本身直接相关,而不与类的各个对象保持关联。静态成员可以是public或private的。静态数据成员的类型可以是常量、引用、指针、类类型等。静态成员函数不能声明成const的,而且也不能在static函数体内使用this指针。这一限制即适用于this的显式使用,也对调用非静态成员的隐式使用有效。注意:静态成员不属于类的某个对象,但是我们仍然可以使用类的对象、引用或者指针原创 2016-02-24 22:23:58 · 354 阅读 · 0 评论 -
继承
如果基类是非虚函数,在继承类中重写该函数时,我想应该不属于继承,而是重写覆盖。#include #include #include using namespace std;class Base{public: void test(){ cout << "base test" << endl; }};class Derived:public Base{public:原创 2016-02-25 09:46:08 · 274 阅读 · 0 评论 -
访问控制与继承
protected成员:1)和私有成员类似,受保护的成员对类的用户(实例)来说是不可访问的。2)和公有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的。3)派生类的成员或友元只能通过派生类对象来访问基类的受保护成员(通过基类对象不能访问基类受保护成员)。 派生类对于一个基类对象中的受保护成员没有任何访问特权。class Base{protected: i原创 2016-02-25 15:55:31 · 477 阅读 · 0 评论 -
重构,重写(覆盖)与重载
重构负责重新设计类的体系以便将操作和/或数据从一个类移动到另一个类中。原创 2016-02-25 11:26:35 · 569 阅读 · 0 评论 -
重载运算符
1.当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数比运算对象的数量少一个。非成员函数调用等价于:data1 + data2; //普通表达式operator+(data1, data2); //等价的函数调用成员函数调用等价于:data1 + data2; //普通表达式data1.operator+(data2); //等原创 2016-02-25 22:07:29 · 388 阅读 · 0 评论 -
虚继承基类构造顺序
#includeusing namespace std;class A{public: A(char *s) { cout << s << endl; } ~A(){}};class B :virtual public A{public: B(char *s1, char*s2) :A(s1){ cout << s2 << endl; }};class C :原创 2016-03-11 10:55:30 · 756 阅读 · 0 评论 -
类型转换操作符
如果想要B可以隐式转换为A,可以用类型转换操作符:#include #include using namespace std;class A{public: A(int _data) :data(_data){} void Display(){ cout << data << endl; }private: int data;};class B{public: B原创 2016-04-06 09:44:11 · 330 阅读 · 0 评论 -
atexit()函数(使main函数之后可以执行其他函数)
可以用atexit()函数来注册程序正常终止时要调用的函数,并且在main()函数结束时,调用这些函数的顺序与注册他们的顺序相反。原型:int atexit(void(*)(void));一个程序最多可以注册32个处理函数。#include#include #include using namespace std;void fn1(void);void fn2(void);原创 2016-03-11 23:03:28 · 499 阅读 · 0 评论 -
编译器默认生成的函数
1.构造函数如果我们没有定义任何构造函数,编译器会为我们生成一个默认的构造函数。如果定义了,则没有默认构造函数,即不能以Class item来定义对象了。因此,不管有没有定义构造函数,最好自己定义下默认构造函数。2.拷贝构造函数3.赋值构造函数4.析构函数5.move构造函数(C++11)6.m原创 2016-02-23 16:36:38 · 942 阅读 · 0 评论 -
编写继承类的复制构造函数和构造函数
当基类存在私有成员时,应该如何编写继承类的复制构造函数呢?方法是在复制构造函数的初始化成员列表中调用基类的复制构造函数。class Base{private: int i;public: Base(int _i) :i(_i){}};class Derived:public Base{public: Derived() :Base(0), j(0){} Derived(原创 2016-03-14 21:55:30 · 3002 阅读 · 0 评论 -
构造函数调用另一个构造函数
#include#include #include #include using namespace std;struct CLS{ int m_i; CLS(int i) :m_i(i){ cout << "CLS(int):this =" << this << endl; } CLS() { CLS(0); //生成一个临时对象,对调用该函数的对象本身没影响原创 2016-03-14 21:42:20 · 595 阅读 · 0 评论 -
C++笔试
1.交换字符串void SwapString(char *&x,char *&y){ char *temp=x; x=y; y=temp;}调用方式:SwapString(a,b);或者void SwapString(char **x,char **y){ char *temp=*x; *x=*y; *y=temp;}调用方式:SwapString(&a,&b)原创 2016-03-14 22:27:35 · 446 阅读 · 0 评论 -
隐式类型转换
先看看什么情况下是隐式类型转换:#include #include #include using namespace std;class Conversion{public: Conversion(string s) { sdata = s; idata = 0; } Conversion & combine(const Conversion& oldC){原创 2016-02-24 19:28:46 · 406 阅读 · 0 评论 -
默认构造函数
如果定义了其他构造函数,最好也提供一个默认构造函数。#include #include #include using namespace std;class NoDefault{public: NoDefault(const string &);};struct A{ NoDefault my_mem;};struct B{ B(){}; NoDefault原创 2016-02-24 18:59:51 · 293 阅读 · 0 评论 -
const成员函数及const
在成员函数参数列表后面加上const,表示该成员函数是const成员函数。这里的const是修饰this指针的类型。默认情况下,this的类型是指向类类型对象的常量指针,即指针本身是常量,但指针所指的对象不是常量。在下面例子中,this的类型是conClass *const,默认情况下不能把this绑定到一个常量对象上。这样使我们不能在一个常量对象上调用普通的成员函数。如果成员函数不改原创 2016-02-23 15:52:21 · 498 阅读 · 0 评论 -
函数指针
1.函数类型:函数类型由它的返回值和参数决定,与函数名无关。bool lengthCompare(const string&, const string&);该函数的类型为:bool (const string&, const string&);2.函数指针:要想声明一个可以指向函数的指针,只需将指针替换成函数名即可:bool(*pf)(const string&, strin原创 2016-03-02 16:58:42 · 220 阅读 · 0 评论 -
指针数组与数组指针
int *a[10]:指针数组,a是数组,数组a里存放了10个int*型指针。int (*a)[10]:a是指针,指向一个数组,此数组有10个int型元素。int (**a)[10]:a是二级指针,指向一个数组,数组有10个int型元素。int*(*a)[10]:a是指针,指向一个数组,数组有10个int*型元素。int(*a[10])():a是数组,数组里面有10个函数指针,指原创 2016-03-02 19:48:01 · 317 阅读 · 0 评论 -
RTTI
RTTI是运行阶段类型识别的简称。可以让基类指针指向任何一个继承类的对象,但是如何知道指针指向的是哪种对象呢?C++有3个支持RTTI的元素:1)如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该运算符返回空指针。2)typeid运算符返回一个指出对象类型的值。3)type_info结构存储了有关特定类型的信息。注意:只原创 2016-03-04 09:01:56 · 371 阅读 · 0 评论 -
关于无符号数的减法为负值
#include using namespace std;int main(){ unsigned int u1 = 42, u2 = 10; cout << u1 - u2 << endl; cout << u2 - u1 << endl; return 0;}上面的输出结果为:324294967264显然下面的结果是-32与16位整数取模后的值。这样理解:原创 2016-02-22 09:59:17 · 16946 阅读 · 1 评论 -
只声明而不定义变量
如果想声明一个变量而不定义它,就在变量前面添加关键字extern,而且不要显式地初始化变量。extern int i; //声明i而非定义iextern int j = 0; //定义int k; //声明并且定义注意:变量能且只能被定义一次,但是可以声明多次。extern变量不能被声明定义在函数内部,形成局部变量,否则与全局变量矛盾。原创 2016-02-22 10:17:56 · 2090 阅读 · 0 评论 -
指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:int i = 42;int *p;int *&r = p;要理解r的类型到底是什么,最简单的办法是从右向左阅读r的定义。离变量最近的符号(&)对变量的类型有最直接的影响,因此r是一个引用。声明符其余部分确定r引用的类型是什么,*说明引用的是一个指针。最后,声明的基本数据类型部分指出r引用的是一个int指原创 2016-02-22 11:07:37 · 2286 阅读 · 0 评论 -
顶层const和底层const
顶层const表示指针本身是个变量,底层const表示指针所指的对象是一个常量。int i = 0;int *const p1 = &i; //顶层constconst int ci = 42; //顶层constconst int *p2 = &ci; //底层const,允许改变p2的值,不允许改变ci的值const int *const p3 = p2;原创 2016-02-22 22:38:12 · 410 阅读 · 0 评论 -
typedef用法
1.常规变量类型定义例如:typedef unsigned char uchar描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明2.数组类型定义例如: typedef int array[2];描述: array等价于 int [2]定义; array a声明等价于int a[2]声明扩展: ty原创 2016-02-23 09:37:43 · 260 阅读 · 0 评论 -
auto类型说明符
编程时,需要把表达式的值赋给变量,这就要求在声明变量时清楚知道表达式的类型。为了解决这个问题,C++11引入auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。auto让编译器通过初值来推算变量的类型。因此,auto定义的变量必须有初始值。auto能在一句中定义多个变量,但是这几个变量的初始值类型必须一致。注意:使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参原创 2016-02-23 09:56:28 · 2246 阅读 · 1 评论 -
函数重载
1.int Func(int,int);不可与下列哪个函数构成重载( )A.int Func(int,int,int); B.double Func(int,int);C.double Func(double,double); D.double Func(int,double);答案:B参数类型,数目不同,可以构成重载,返回类型不同不能构成重载。原创 2015-12-23 10:43:18 · 633 阅读 · 0 评论 -
友元函数、友元类、友元成员函数
注意友元成员函数定义的3个步骤:#include #include #include using namespace std;class A;class C{public: void display(const A &a); //1.要想该成员函数称为A的友元成员函数 //先定义C类,声明display函数,但是不能定原创 2016-02-24 09:59:58 · 613 阅读 · 0 评论 -
求二范数C++代码
#include #include using namespace std;#define NUM 3float num[NUM][NUM] = { 1,2,3,4,5,6,7,8,9 };void Loop(float a[NUM][NUM], float u[NUM], int n){ float S, U[NUM]; int i, j; for (int i = 0原创 2016-11-23 20:07:16 · 5369 阅读 · 2 评论