![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++学习笔记
c++ primer plus学习笔记
风向决定发行D
在读硕士
展开
-
多重继承MI
多重继承多重继承又被称为MI,就是继承多个类.这会引起很多问题,主要有两问题:从多个不同基类继承的同名方法从多个类继承相同类实例设计一个类类设计图如上所示,定义一个Worker类, Singer类和Waiter类是Worker类的派生类,SiningWaiter继承了Waiter和Singer两个类.类设计如下首先定义Worker,Singer,Waiter类class Worker // 这是一个ABC类 { private: std::string fu原创 2020-05-25 21:24:59 · 255 阅读 · 0 评论 -
多态公有继承
多态公有继承基类的公有函数被派生类继承下来,但是派生类又重新定义了某个基类共有函数,也就是说同一个对象在派生类和基类的表现是不一样的,方法的的调用取决于调用方法的对象.实现这种行为的方法:在派生类中重新定义基类的方法使用虚方法下面设计一个类来演示这种方法设计一个Brass类和BrassPlus类需求如下:支票账户如下:客户姓名账号当前余额执行操作:创建账户存款取款显示账户信息银行可以透支,添加如下信息:透支上限透支利率当前透支总额改变以往操作原创 2020-05-25 21:22:22 · 216 阅读 · 0 评论 -
队列
const数据成员无法被赋值有const限定的字符不能改变其值,只能在被创建的时候进行初始化,比如const int qsize;qsize = 10;cout << qsize << endl;错误结果如下:引用数据类型无法被赋值例如 :int size = 10;int & qsize;qsize = 11 ;cout << size << endl;报错 :修改如下 :int & qsize = siz原创 2020-05-25 21:16:00 · 186 阅读 · 0 评论 -
对象数组
对象数组字面意思,对象数组就是有很多对象组成的一个线性结构,类似于基本类型的数组,声名也和基本类型数组一样比如一个stock类class stock { private : std :: string company; long shares; double share_val; double total_val; void set_tot() { tota原创 2020-05-25 21:12:32 · 434 阅读 · 0 评论 -
动态内存和类
程序编译和运行时所谓程序编译就是其实就是翻译的过程,翻译成为01二进制代码,但是呢,例如java语言你翻译之后能让jvm运行的底层01.编译就是检查检查语法错误,好能够满足语法要求,可以运行.所谓运行,就是编译程序正确,装载到内存中,要开始跑起来了,这才开始分配内存什么的,比如malloc,比如new之类的,都是要程序运行起来才能完成的功能.内存负载所谓的内存负载就是浪费大量的内存,比如说有一个可以存40个字符的字符数组,我用了两千个数组,但是每个数组我只用了1个字符大小的空间笑出声音…这时原创 2020-05-25 21:11:08 · 270 阅读 · 0 评论 -
定位new运算符
void*通用指针类型在c/c++语言中,void*是虚无的,任意的,也就是可以用来强制转换任意的指针类型,比如说char base[4] = {'a' , 'b' , 'c', '\0'};cout << base << endl;cout << (void*)base << endl;运行结果如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mB62Hovy-1590411769396)(QQ截图201912原创 2020-05-25 21:07:14 · 296 阅读 · 0 评论 -
抽象基类
抽象基类抽象基类的出现是因为,is-a规则并不是十全十美的,比如一个椭圆类派生出圆类,圆的实现比椭圆简单很多,只需要一个半径就可以描述出来,但是呢,椭圆作为基类需要描述长轴,短轴之类的.所以通过以上例子可以看出,is-a并不是完美的,若果将各个类中重复最多的数据和接口抽象出来,组成一个基类,被称为抽象基类(ABC),这个抽象基类可以作为派生出子类,更加适合.利用ABC这种方式,将园和椭圆中共性放在与一个ABC中,但是,其中有些方法不能是共有实现的,比如计算面积是不能通用的.所以c++提供了一种将不能实原创 2020-05-25 21:00:42 · 844 阅读 · 0 评论 -
成员模板
成员模板模板可作为结构,类,模板类的成员,模板函数也可以作为模板类的成员.用U ,T ,V 三个类型参数设计一个模板类.template <typename T> // T为这个模板类的类型参数 class beta { private: template <typename V> // 在类中也可以使用模板 class hold { private: V val; public: hold(V v = 0)原创 2020-05-25 20:58:48 · 137 阅读 · 0 评论 -
成员初始化列表
const数据成员无法被赋值有const限定的字符不能改变其值,只能在被创建的时候进行初始化,比如const int qsize; qsize = 10; cout << qsize << endl;错误结果如下:引用数据类型无法被赋值例如 :int size = 10;int & qsize;qsize = 11 ;cout << size << endl;报错 :修改如下 :int & qsize = s原创 2020-05-25 20:57:48 · 178 阅读 · 0 评论 -
标准string类构造函数
string构造函数及使用:#include <iostream> #include <string> int main() { using namespace std; string one("Lottery Winner!"); // string(const char *) cout << one << endl; string two(20 , '$'); // string(整形,char c),初原创 2020-05-25 20:55:17 · 284 阅读 · 0 评论 -
valarray模板类
c++ primer plus学习原创 2020-05-25 20:48:01 · 220 阅读 · 0 评论 -
srand和rand
srand(seed)和rand()通过调用srand(seed)可以设置rand()的种子值,每一次调用rand()就是产生随机数,但是第二次调用rand()产生的随机数还是一样的,因为rand()调用之前,会查看seed值来初始化它的值,没有设置的话,每次的seed值是一样的,通过srand(seed)设置seed值,可以使每次产生的随机数都不一样.time(0)代表1970年00:00:00直到windows操作系统自带的时间.int main(){ using namespace std;原创 2020-05-25 20:47:37 · 1069 阅读 · 2 评论 -
strncpy
strncpy原型char * strncpy(char * dest, char * src, size_t n);作用:将src前n个字符放入deset所指空间中.打印函数如下:void print_string(char * c , int n){ for(int i = 0 ; i < n ; i++) { if(c[i] == '\0') { cout << "NULL"; } cout << c[i] <原创 2020-05-25 20:47:22 · 1475 阅读 · 0 评论 -
n维数组
一维数组一维数组是在存储空间中开辟一段连续存储地址的存储空间用来存储数据,代码如下#include<iostream>using namespace std;int main (){ //一维数组 int array[5] = { 1 ,2 , 3 ,4 ,5 }; int (*p)[5] = &array; //数组指针:**指向整个数组** cout << int(array)原创 2020-05-25 20:47:02 · 1934 阅读 · 0 评论 -
new和delete
title: new和deletedate: 2019-12-07 19:24:36categories: cpptags:new 和 delete 深层次用法String类class String{private: char * str; // 指向字符串的指针 int len; // 字符串长度 static int num_strings; // String类对象个数 static const i.原创 2020-05-25 20:43:30 · 97 阅读 · 0 评论 -
protected
protected关键字例如:class Brass{protected: double balance; .....}意思就是在protected中的数据和方法在派生类中可以正常使用,但是在其他作用域是不能直接访问.原创 2020-05-25 20:43:18 · 192 阅读 · 0 评论 -
指向对象的指针
指向对象的指针所谓指向对象的指针例如:String* favorite = new String(sayings[某个数]).这个是利用复制构造函数进行初始化的,调用的是String(const String& ),favorite就是指向被创建的新对象的指针,这个新创建的对象是没有名字的,通过favorite进行管理.类声明如下:class String { private: char * str; // 指向字符串的指针 int len;原创 2020-05-25 20:42:26 · 1376 阅读 · 0 评论 -
has-a例子
has-a对比is-a关系模型A is-a B是A属于B的,而A has-a B是A包含B设计student类student对象中含有string对象存储姓名和valarray< double >对象存储分数.student设计图如下:这个类的设计不能用公有继承,而是用包含的方式,Student对象不能直接用string和valarray类中的对象,而是在类的内部可以通过域运算调用或者在类中通过string和valarray对象调用.Student类如下class Studen原创 2020-05-25 20:40:42 · 528 阅读 · 0 评论 -
istream成员函数
cin.getline(array_name , arraysize)用法cin.getline(array_name , arraysize),用于输入一整行字符串,可以使空格,遇到回车停止,并将回车字符自动替换成’\0’.代码如下#include <iostream>using namespace std;int count_array(char* point);int main(){ char temp[40]; cin.getline(temp,40); cout &原创 2020-05-25 20:37:35 · 201 阅读 · 0 评论 -
实现string基本功能
修订后的各个函数知道如何使用复制构造函数和赋值运算符就能正确管理内存的new和delete,就不用在监视构造函数和析构函数了.如何使管理内存和类.创建一个String类:class String { private: char * str; // 指向字符串的指针 int len; // 字符串长度 static int num_strings; // String类对象个数 static const i原创 2020-05-25 20:26:32 · 176 阅读 · 0 评论 -
私有继承
私有继承公有继承实现is-a模型,私有继承实现has-a模型.私有继承将基类的公有成员和保护成员继承成为派生类的私有成员,这意味着派生类对象不能使用私有函数,但是在派生类域内也能使用私有成员.包含将对象作为一个命名的成员对象添加到类中,私有继承将对象作为一个未被命名的继承对象添加到类中,称为子对象.这是和包含的第一个区别.这样私有继承就完成了has-a模型的实现.私有继承和包含的区别私有继承格式如下:class Student : private string,private valarray原创 2020-05-25 20:26:15 · 399 阅读 · 0 评论 -
数组模板和模板参数
类型参数泛型名称声明:template<typename T>上述T是一泛型名称,也是通过typename指明的类型参数,string,int作为具体的类型传入进去,非类型参数就是在模板中加入常规类型变量int n,n本身指的就是int型,不是用作泛型,就是非类型参数.可设定大小容器类实现模板通常用于容器类,容器类的大小可以自我设定有两种方法:通过动态分配和构造函数参数,但是,这样比较麻烦,因为,在类中进行动态分配,要考虑到赋值运算符,复制构造函数的重写.通过在模板上的参原创 2020-05-25 20:25:43 · 644 阅读 · 0 评论 -
派生类和基类的关系
派生类可以使用基类函数例如以下类:class TableTennisPlayer { private: string firstname; string lastname; bool hasTable; public: TableTennisPlayer (const string & fn = "none", const string & ln = "none", bool ht = false);原创 2020-05-25 20:24:45 · 407 阅读 · 0 评论 -
模板作为参数
模板作为参数模板这种也是可以作为参数的template <template class Thing>,其中template class 就是带一个泛型的类型,Thing是参数,意味着,Thing接受带一个泛型参数的类型.利用一个类模板作为作为头文件:template <typename Type>class Stack{private: enum {MAX = 10}; // constant specific to class Type it原创 2020-05-25 20:24:23 · 694 阅读 · 0 评论 -
模板类的正确使用
用的string实例化,但是为了达到这个目的,不能随便用模板的内容.比如:Stack<char *> st;如果想达到字符串的效果,若把模板类中的string po;更换为char * po,是绝对错误的,因为没有给po分配空间,无法达到字符串的效果.更换为char po[40],也不行,po是char型,是数组名,是不能被赋值的,pop(char & item),从容器中弹出的内容是不能赋值给数组名.换成动态分配char * po = new char [40],每次都是指同原创 2020-05-25 20:23:52 · 606 阅读 · 0 评论 -
类作用域及域内枚举
类作用域及域内枚举类作用域是C++引进的一种在类中的作用域,比如类成员函数就要用 :: 域作用符调用,比如类stockclass stock{private : std :: string company; long shares; double share_val; double total_val; void set_tot() { total_val = shares原创 2020-05-25 20:23:27 · 337 阅读 · 0 评论 -
类模板
类模板队列类被称为容器类,是用来存储其他对象或者其他数据类型的,而之前设计的队列类只能用来存储一种数据类型,如果要存储其他类型就要重新写另外一种,为了考虑到代码重用,编写一个类模板,这样的容器类就可以存储不同种类的数据.定义类模板用栈这种结构设计一个栈的模板类举例:template <class Type> class Stack { private: enum {MAX = 10}; // 栈长度 Type items[MAX]; // 用数组申请原创 2020-05-25 20:23:08 · 256 阅读 · 0 评论 -
继承的动态分配
继承与动态分配是怎样调节的,如果基类使用动态内存分配,并重新定义复制构造函数,赋值运算函数,析构函数,影响着派生类的实现,具体实现取决于派生类是否是动态内存分配的.派生类不是动态内存分配基类:class baseDMA { private: char * label; int rating; public: baseDMA(const char * l = "null" , int r = 0); baseDMA(const baseDMA & r原创 2020-05-25 20:22:30 · 155 阅读 · 1 评论 -
简单文件输入-输出
简单的文件输入/输出手工输入数据效率很低,c++有处理的读取文件和输入到文件的I/O功能,比如简单的文本文件.txt,而平时运行的代码都是在控制台上面显示的,Windows中的DOS,Ununtu下的终端等等,这是cout和cin下的输入输出d到控制台.写入到文本文件中cout用于控制台的输出.cout是ostream类的对象,包含在iostream中(#include )cout在名称空间std下面(using std :: cout)cout对象通过了运算府<<来输出各种数据(原创 2020-05-25 20:21:41 · 239 阅读 · 0 评论 -
静态和动态联编
函数名联编源码中的函数调用解释为特定的函数代码块被称为函数名连编.静态联编和动态联编因为c++语言需要处理函数重载的问题,编译器在查看函数名的时候,还要查看参数,但是C语言直接看函数名就行了,这种联编可以在编译过程完成这种联编被称为静态联编.使用那个虚函数不能在编译的时候确定,编译器是无法确定程序员选择的是那个对象,所以编译器生成了在程序运行的时候能够选择正确的虚函数的方法,这被称为动态联编.指针和引用类型兼容一般c++中是不允许将一种类型的指针指向另一种类型的指针,引用也不允许,例如:dou原创 2020-05-25 20:21:03 · 226 阅读 · 0 评论 -
类的自动转换与强制类型转换
类的自动转换与强制类型转换类的自动转换就是说,可以将类定义成与基本类型或另一个类相关,使得从一种类型转换为另一种类型是相关的以下定义一个将磅转换为英石(磅和英石是重量单位)的一个类,1英石(st) = 14磅(lb)class Stonewt{private: enum {Lbs_per_stn = 14}; // 每磅14英石 int stone; // 整数部分英石 double pds_left;原创 2020-05-25 20:20:46 · 256 阅读 · 0 评论 -
类继承
类继承类继承就是在已有类的基础之上,对这个类进行修改,可以给原有类增加数据和方法.,也可以修改原有类,增加代码复用的一种技术.设计一个乒乓球俱乐部会员的类class TableTennisPlayer { private: string firstname; // 姓名 string lastname; bool hasTable; // 是否有座位 public: TableTennisPlayer (const string & fn =原创 2020-05-25 20:20:03 · 145 阅读 · 0 评论 -
构造函数和析构函数
构造函数一般来说只能通过类成员函数来访问隐藏数据,从而才能将数据成功初始化,C++的目标之一就是让类对象像是标准类型一样,常规的初始化方法不适用于类对象,为此,C++专门提供了一种特殊函数-构造函数,用来构造新对象,将值复制给对象的数据成员.有构造函数的情况下将自动调用构造函数.比如,这样一个stock的类,stock类的构造函数就是就是名为stock的成员函数,也就是说一个类的构造函数,其构造函数名称就是类名,而且构造函数没有返回值,也没有被声明为void,构造函数也没有声名类型.class sto原创 2020-05-25 20:19:26 · 185 阅读 · 0 评论 -
函数模板
函数模板函数模板使用泛型来定义函数,泛型可以用具体的int,double类型替换,用来达到缩短代码的目的.比如,交换两个数值的函数.声明:template <typename T> void swap(T & a , T & b);实现:template <typename T>void swap(T & a , T & b){ T temp; temp=a; a = b; b = temp;}原创 2020-05-25 04:42:44 · 173 阅读 · 0 评论 -
运算符重载和友元函数
运算符重载所谓运算符重载其实就是运算符的多态,函数的多态就是同个函数名有不同的功能,运算符重载或者运算符多态就是同一个运算符有多个意思,在c语言中,出现过类似运算符重载的例子,比如int x,y,z;int* p;x = 1;y = 1;z = x * y;p = &x;以上代码指出,*这个符号不仅可以用来计算数字之间相乘的结果,而且还可以解引用指针所指的空间中的值.在c++中如果我定义一个类Time,这个类有两个对象time1,time2,我要计算time1,time2的和怎么原创 2020-05-25 03:57:31 · 988 阅读 · 0 评论 -
this指针
this指针就是指向调用成员函数的对象,比如下面这个类class stock{private : std :: string company; long shares; double share_val; double total_val; void set_tot() { total_val = shares * share_val; }public :原创 2020-05-25 20:47:46 · 127 阅读 · 0 评论