C/C++
C C++程序
shao15232_1
种树有两个最好的时间节点,一个是十年前,一个是现在!
展开
-
C++(五十五)之多继承中的菱形继承问题
菱形继承问题如下:他们共有一个祖先类,到最下面的类的时候,又合并成了一个类。对于Animal的属性,在Sheep和Camel中都被继承了一份。同样地,当SheepCamel多继承于Sheep和Camel的时候,就会出现重复成员的继承。这会造成内存不必要的开销。解决办法是使用虚基类继承。下面我们举例说明:/****************************...原创 2020-04-08 21:49:05 · 239 阅读 · 0 评论 -
C++(五十四)之多继承的概念
本篇主要来讲解一下多继承的概念,多继承模式:class A既可以拥有B1的属性,又可以拥有B2的属性。多继承也有缺陷,容易产生二义性。这个时候需要使用作用域来解决二义性的问题,下面上代码演示:/**************************************************** * brief : 多继承的概念及缺点 * author : ...原创 2020-04-07 22:12:47 · 158 阅读 · 0 评论 -
C++(五十三)之继承同名静态成员处理
上一篇讲解的是非静态成员,在继承中的处理。本篇主要讲解静态成员在继承中的处理。其实静态成员和非静态成员同名时,在使用的方法上是一样的。下面举例说明:/**************************************************** * brief : 继承中静态成员的处理 * author : shao * date : 2020-04-0...原创 2020-04-07 21:38:58 · 211 阅读 · 0 评论 -
C++(五十二)之继承同名成员处理
继承中,有时候会遇到子类和父类的成员名相同。无论是成员变量,还是成员函数。在调用的时候,编译器都会执行就近原则。当子类想要调用父类的成员时,需要使用父类的作用域。同名后,父类的成员会被自动隐藏,除非显示调用。下面举例说明:/**************************************************** * brief : 继承中同名函数的处理...原创 2020-04-07 21:18:36 · 610 阅读 · 0 评论 -
C++(五十一)之继承类对象模型初探
本文主要介绍,在继承中继承类在内存中的实际分布情况。下面我们举例说明:/**************************************************** * brief : 继承中的对象模型 * author : shao * date : 2020-04-02 * note : 探查继承后,对象在内存中的实际分配方式 * ******...原创 2020-04-02 22:42:46 · 105 阅读 · 0 评论 -
C++(五十)之继承类的构造和析构顺序
本文主要讲解一下,在类的继承中。构造函数和析构函数的继承关系,和调用顺序。1、子类对象在创建时会首先调用父类的构造函数2、父类构造函数执行完毕后,才会调用子类的构造函数3、当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数4、析构函数调用顺序和构造函数相反下面我们举例说明:/**********************************...原创 2020-04-02 22:21:39 · 1693 阅读 · 0 评论 -
C++(四十九)之类的继承方式
上一篇我们讲了类的继承,本文我们来讲解一下类的继承方式。类的继承:class B;class A: 继承方式 B ...继承的名词:父类(基类) 子类(派生类) 名词是对应的。要注意这里的继承方式有三种:public protected private不同的继承方式,对父类的访问权限不同:大家直接看举例的图,文字描述后会变得更...原创 2020-04-01 22:59:48 · 116 阅读 · 0 评论 -
C++(四十八)之类的继承
到这里我们终于到了类的继承。为什么要用类的继承,因为可以减少代码的重复性!!!假设A作为基类,BCD等等子类都继承于A类。那么A类的实现部分,被BCD继承后,子类就会拥有A类的属性。而不用再次重复A类的代码。BCD在A类的基础上添加自己的属性,就会拥有与A类不同的特性。这就是在继承中发展。下面我们以新闻网页为例:由上图可以看出,在中间的conte...原创 2020-04-01 22:32:55 · 131 阅读 · 0 评论 -
C++(四十七)之二重指针
#include <stdio.h>void swap(int **val1, int** val2){ int temp = **val1; **val1 = **val2; **val2 = temp;}int main(void){ int i = 10; int j = 15; int* a = &i; int* b = &j; ...原创 2020-03-20 15:17:02 · 185 阅读 · 0 评论 -
C++(四十六)之符号重载总结
我们前面有说过可以重载的运算符有:下面我们队这些常用重载的运算符进行分类整理一下:= [] () -> * 这些操作符只能通过成员函数进行重载。<< >> 只能通过全局友元函数进行重载。|| && 不建议重载,因为无法保证短路原则。...原创 2020-03-13 11:44:35 · 89 阅读 · 0 评论 -
C++(四十五)之[]符号重载
本篇主要讲解一下数组的索引,[]的重载。基本类型的数组,我们编译器会有预定义的[]类型。当我们使用自定义类型的数组时候,[]需要我们进行重载。下面我们举个例子说明。/**************************************************** * brief : []运算符重载 * author : shao * date : 20...原创 2020-03-13 11:35:32 · 229 阅读 · 0 评论 -
C++(四十四)之函数调用符
本篇我们主要讲解函数符号的重载。函数符号(),那么他的重载有什么用呢。目前我们先了解到,函数符号可以用来做仿函数就可以了。下面我们举例说明一下:/**************************************************** * brief : ()函数符重载 * author : shao * date : 2020-03-13...原创 2020-03-13 11:00:36 · 380 阅读 · 0 评论 -
C++(四十三)之关系运算符
今天我们主要讲解关系运算符的重载。关系运算符 == != 两个。编译器提供的是基本类型的关系运算符,而我们要使用自定义类型的关系运算符的时候,就需要对其进行重载。下面我们举例说明:/**************************************************** * brief : == != 关系运算符重载 * author : sh...原创 2020-03-13 10:43:38 · 244 阅读 · 0 评论 -
C++(四十二)之赋值运算符重载
在我们的使用类对象的时候,有时候会直接用赋值运算符来对类的对象直接拷贝!如果我们没有对赋值运算符做重载的话,有些编译器是只做浅拷贝,前面我们有说过浅拷贝的缺点,请参考:https://blog.csdn.net/shao15232/article/details/104540994所以我们今天要对赋值运算符进行深拷贝的重载。下面我们举例说明:/*******...原创 2020-03-10 22:19:44 · 153 阅读 · 0 评论 -
C++(四十一)之-> *运算符重载(智能指针对自定义对象的托管)
我们在堆中申请对象内存的时候,需要记得去释放。但是有没有能让在堆中申请的内存自动释放呢?当然有,就是我们的指针重载运算符可以实现。我们可以设计一个智能指针,该指针指向我们设计可用的对象,在使用完成后可以自动释放堆中的内存。下面我们举例说明:/**************************************************** * brief...原创 2020-03-10 21:40:06 · 222 阅读 · 0 评论 -
C++(四十)之自增自减运算符重载
自增自减运算符也可以重载,那么我们的函数名称都是type operator@(type) //@是重载符{ //函数体}我们要如何区分前置和后置呢?我们使用占位符, operator++(){} 就是前置自增。operator++(int){} 就是后置自增。同理,operator--(){} 就是前置自减。operator--(int){} 就是后置...原创 2020-03-10 15:41:52 · 540 阅读 · 0 评论 -
C++(三十九)之左移运算符重载
我们在C++中使用输出的时候,格式一般为: cout << xxx << endl;那么我们的<<运算符就会出现两个操作数,cout是第一个操作数,xxx是第二个操作数。所以假设我们把<<重载符号写入在类内部,那么第一个操作数就会变成对象 instance.cout << xxx...会变成这样的格...原创 2020-03-10 14:53:44 · 323 阅读 · 0 评论 -
C++(三十八)之加号重载
今天我们来讲一下运算符的重载。运算符重载(Overloading operator)其实也是一种函数的调用方式。运算符重载说白了就是我们赋予原来的运算符新的计算方式,只不过这个方式要根据上下文来判定,这部分编译器会自动给我们做好。运算符重载的格式:type operator@(type) //@代表要重载的运算符{ //函数体}可以重载的运算符有一下这些:...原创 2020-03-10 14:12:43 · 183 阅读 · 0 评论 -
C++(三十七)之数组类的封装
设计一个数组类。功能:1、获取数组长度。2、获取指定元素值。3、修改指定位置元素值。4、从尾部插入数据。下面我们举例说明:Array.h:#ifndef __CLASSARRAY_H#define __CLASSARRAY_H#include <iostream>using namespace std;class Array{ ...原创 2020-03-09 22:31:07 · 101 阅读 · 0 评论 -
C++(三十六)之电视机和遥控器友元类
我们今天设计的是简单的电视机和遥控器。电视机类能控制电视开关机、调整音量和频道。而这些功能在遥控器上面也可以完成,所以把遥控器设置成电视机的友元类。这样遥控器也可以访问电视机内部的private成员。下面我们上代码举例说明;和之前的分文件编写一样,我们把遥控器分成*.cpp *.h两个文件。电视机也分成*.cpp *.h两个文件。最后在main.cpp中调用。在...原创 2020-03-09 14:27:16 · 1619 阅读 · 0 评论 -
C++(三十五)之友元类
本篇我们介绍友元类。上一篇我们知道友元函数可以访问类内部的private属性成员。那么友元类呢?友元类也可以访问类的私有属性,但要注意:1、友元关系不能被继承。(A是B的友元类,C继承于A, 但C不一定是B的友元类。除非B显式声明C也是友元类)2、友元关系不能被传递。(A是B的友元类,B是C的友元类,但A不一定是C的友元类,除非C显式声明A是友元类)...原创 2020-03-06 17:07:38 · 160 阅读 · 0 评论 -
C++(三十四)之全局友元函数
在我们的class中,权限分为public,protect, private三个等级。外部访问的时候,只有public权限的成员属性可以被访问。那么如果我们要让外部的一个全局函数访问class内部的private和protect属性的成员,要如何操作呢?本篇我们讲解一下全局友元函数,顾名思义,友元函数可以访问class内部private属性的成员。下面我们举例说明:家里...原创 2020-03-06 16:14:04 · 318 阅读 · 0 评论 -
C++(三十三)之const成员函数和const 对象
我们前面学过const修饰的常指针,在常指针定义的时候需要初始化,且后续不可以再改变。那么今天我们学习一下常成员函数和常对象。常成员函数: 格式如下void memFunc(void) const常对象:const Person *p = new Person();语法很简单,但是我们在使用的时候要注意:常成员函数只能被调用,不能修改成员变量,除非成员变量有mut...原创 2020-03-06 15:43:37 · 127 阅读 · 0 评论 -
C++(三十二)之NULL访问对象成员函数
在对象指向NULL的时候,虽然没有指向任何内存。但是class的成员函数已经分配好内存。NULL可以调用和成员变量内存无关的成员函数。下面举例说明:/**************************************************** * brief : 空指针访问成员函数 * author : shao * date : 2020-03-...原创 2020-03-05 23:02:17 · 406 阅读 · 0 评论 -
C++(三十一)之this指针的使用
由上一篇我们知道,在C++的编译器内部。类的普通成员函数,静态成员变量,静态成员方法都不是分配在类内部的内存中。对于静态成员变量和静态成员方法中没有this指针。this指针只存在于普通成员变量和成员方法。但是,成员函数只有一份,那么如何区分是哪个对象在调用当前的成员方法呢。下面我们模拟一份成员函数在编译中的存在,大家可以看到,在编译的时候,编译器默认都会帮用户添加一个...原创 2020-03-05 22:44:19 · 227 阅读 · 0 评论 -
C++(三十)之面向对象模型初探
C++的类的设计中我们可以看到类对数据和属性进行了封装。但是封装的内部是什么样子的呢?今天我们就这些基础的知识进行探讨一下。在成员变量和成员属性中,类内部的实现是如何的?下面我们举例说明一下:/**************************************************** * brief : C++面向对象模型初探 * author : ...原创 2020-03-01 22:48:10 · 132 阅读 · 0 评论 -
C++(二十九)之单例模式设计
对于一些特殊的类,只能提供一个实例化对象。比如国家最高领导人,比如win7的任务管理器。下面我们以打印机为例子举例说明一下如何实现单例模式。假设公司只有一台打印机,那么这个打印机需要给大家共享。/**************************************************** * brief : 单例模式设计 * author : sha...原创 2020-03-01 22:19:15 · 116 阅读 · 0 评论 -
C++(二十八)之static静态成员属性介绍
上一篇我们介绍的是静态成员变量,本篇我们介绍静态成员属性。静态成员属性和静态成员变量类似,具体要注意的点如下: 1、静态成员属性只能访问静态成员变量。 2、静态成员属性的使用方法和静态成员变量一样的。 3、普通成员属性既可以访问静态成员变量也可以访问普通变量 4、静态成员属性也有权限之分下面我们举例说明,注意这里面的test01内部的测...原创 2020-03-01 21:31:27 · 391 阅读 · 0 评论 -
C++(二十七)之static静态成员变量介绍
在类的定义时,我们的成员变量有静态的和非静态的。之前我们所介绍的类的成员都是非静态的。今天我们介绍一下static 修饰的静态成员变量。首先是在形式上:class A{ static int var; //那么这个变量var就是静态成员变量。};静态成员变量要注意的点: 1、静态成员变量必须在类中声明,类外初始化。 2、静态成员变量不属于某...原创 2020-03-01 20:42:10 · 218 阅读 · 0 评论 -
C++(二十六)之new操作符在数组中的应用
上一篇我们学习了new操作符针对单个对象。本篇我们主要介绍,new操作符在数组中的应用。在C++也可以认为"一切皆对象",因为我们的基本操作类型也可以看作是类。(个人看法)下面我们举例看下在数组中,new的用法。当然new和delete是成对出现的,code中也会对delete的用法加以介绍。源码如下:/**********************************...原创 2020-02-29 20:25:29 · 355 阅读 · 0 评论 -
C++(二十五)之new操作符的使用
之前我们申请对象的时候都是用如下方式:Person p1;Person p2(...);等等这样的。这样申请的对象分配的地址是在内存的栈中。那么我们如何在堆中申请空间来存储对象呢?答案就是用 new操作符。下面我们举例说明:/**************************************************** * brief : ne...原创 2020-02-29 19:32:07 · 116 阅读 · 0 评论 -
C++(二十四)之explcit关键字的使用
声明为 explicit 的构造函数不能在隐式转换中使用。/**************************************************** * brief : 测试explicit关键字 * author : shao * date : 2020-02-27 * note : none * **********************...原创 2020-02-27 23:20:19 · 465 阅读 · 0 评论 -
C++(二十三)之类对象作为成员
类中的成员是对象时,就叫类的对象作为成员。当调用构造函数时,首先按各对象成员在类定义中的顺序(和参数列表的顺序无关)依次调用它们的构造函数,对这些对象初始化,最后再调用本身的函数体。也就是说,先调用对象成员的构造函数,再调用本身的构造函数。析构函数和构造函数调用顺序相反,先构造,后析构。下面举例说明:/*************************...原创 2020-02-27 23:06:58 · 874 阅读 · 0 评论 -
C++(二十二)之列表初始化模式
就是用列表的方式初始化成员变量。注意:初始化列表只能在构造函数中使用。下面我们举例说明:/**************************************************** * brief : 测试初始化列表 * author : shao * date : 2020-02-27 * note : none * *********...原创 2020-02-27 22:25:50 · 106 阅读 · 0 评论 -
C++(二十一)之深拷贝和浅拷贝
C++中在类的对象拷贝的时候,会有深拷贝和浅拷贝之分。在浅拷贝中可能会隐藏一些坑,这个需要我们注意。深拷贝:两个对象的内容完全一样,但是没有公用的 内存,各自有独立的内存存放内容。浅拷贝:同一类型的对象之间复制,是的两个对象的 成员变量相同,仍然是两个独立的对象。 但是有公用内存的部分。下面...原创 2020-02-27 17:53:35 · 179 阅读 · 0 评论 -
C++(二十)之拷贝构造函数调用时机
1、用一个对象初始化另一个对象 2、对象以值传递的方式传给函数参数3、函数局部对象以值传递的方式从函数返回(vs debug 模式下调用一次拷贝构造,qt 不调用任何构造)下面举例说明:/**************************************************** * brief : 简单的类的引入 * author : shao * dat...原创 2020-02-27 16:50:53 · 211 阅读 · 1 评论 -
C++(十九)之构造函数分类及调用情景
构造函数分类:* 按参数: 有参构造函数和无参构造函数* 按类型: 普通构造函数和拷贝构造函数下面举例说明:/**************************************************** * brief : 构造函数的分类及调用 * author : shao * date : 2020-02-24 * note : n...原创 2020-02-27 16:26:45 · 205 阅读 · 0 评论 -
C++(十八)之构造函数介绍
/*** 构造函数:* 构造函数在形式上和类名相同且没有返回类* 型。但是可以重载。形式如下:* public: 类名(){} * public: 类名(type param1, ...){...}* 对于实例化的时候,给对象一个默认的属性。* 当我们不写构造函数的时候,编译器会自动* 帮我们添加默认的构造函数。且添加的构造* 函数没有任何参数,也没有任何...原创 2020-02-27 15:52:54 · 129 阅读 · 0 评论 -
C++(十七)之设计一个立方体类
今天我们主要讲解如何设计一个相对完整的类。但是没有分文件编写。这其中需要注意的是,我们在重载函数的时候,在参数传递这块,在内存的消耗上面有所不同。具体分析在程序中有注释部分需要认真看下。/**************************************************** * brief : 设计一个立方体类 * author : shao ...原创 2020-02-27 13:31:48 · 2245 阅读 · 1 评论 -
C++(十六)之C++中访问权限的控制
C++中访问权限的控制只有三个级别:封装1. 把变量(属性)和函数(操作)吅成一个整体,封装在一个类中2. 对变量和函数迕行访问控制访问权限1. 在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问2. 在类的外部(作用域范围外),访问权限才有意义:public,private,protected3. 在类癿外部,叧有 public 修饰的成员才能被访问,在没有涉及...原创 2020-02-25 22:45:32 · 251 阅读 · 0 评论