![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C\C++基础
代码黑洞_
好记性不如烂笔头
展开
-
C接口的封装和设计
导出和导入DLL环境:win10, Visual Studio 2017首先打一个简单的测试环境,这里我们采用的隐式链接//.h文件#pragma once#ifndef _INC_TEST_H#define _INC_TEST_H#ifdef __cplusplusextern "C"{#endif //初始化 int init(void **handle/*out*/); //发送数据 int sendData(void *handle/*in*/,原创 2020-09-01 13:17:46 · 1417 阅读 · 0 评论 -
文件读写操作
ofstream类的默认构造函数原形为:ofstream::ofstream(constchar *filename,int mode = ios::out,int penprot = filebuf::openprot);filename: 要打开的文件名mode: 要打开文件的方式prot: 打开文件的属性c++中对文件的操作可以通过fstream来实现...原创 2019-11-08 15:40:03 · 277 阅读 · 0 评论 -
标准IO输入流API
在输入输出流概念当中有一个非常重要的概念:缓冲区读和写是站在应用程序的角度来说的。输入的数据会先滞留到缓存区,有输出命令时回去缓存区拿数据。1、cin cout能根据类型 获取数据/输入数据注:cin当遇到结束符(Space、Tab、Enter)时,会停止接受输入,结束符不会保存到数据中int main(){ char mChar[10]; int mInt; l...原创 2019-11-07 16:57:27 · 144 阅读 · 0 评论 -
异常的层次结构(继承在异常中的应用)
案例:设计一个数组类 MyArray,重载[]操作,数组初始化时,对数组的个数进行有效检查1)size<0 抛出异常eNegative2)size= 0 抛出异常 eZero3)size>1000抛出异常eTooBig4)size<10 抛出异常eTooSmall5)eSize类是以上类的父类,实现有参数构造、并定义virtual void pr...原创 2019-11-07 11:23:23 · 111 阅读 · 0 评论 -
异常变量的声明周期
1、throw的异常是有类型的,可以是,数字、字符串、类对象。2、throw的异常是有类型的,catch严格按照类型进行匹配。3、注意 异常对象的内存模型 。传统的异常处理错误方法使用switch语句去处理throw类对象类型异常#pragma warning(disable : 4996)#include <iostream>using namespace...原创 2019-11-06 18:17:15 · 147 阅读 · 1 评论 -
异常处理——栈解旋(unwinding)
异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。#pragma warning(disable : 4996)#include <iostream>using namespace std;class Test{public: Test(int a,i...原创 2019-11-06 15:03:15 · 314 阅读 · 0 评论 -
异常处理机制
异常处理的基本思想1、C++中异常处理机制使得异常的引发和异常的处理不必在同一个函数中。2、异常是专门针对抽象编程中的一系列错误处理的,C++的函数机制是栈结构,先进后出,依次访问,无法跳跃。3、异常超脱于函数机制,决定了其对函数的跨越式回跳。4、异常跨越函数异常处理的基本语法普通用法//基本用法void Add(int a,int b){ if ...原创 2019-11-06 11:48:35 · 148 阅读 · 0 评论 -
类型转换
c语言中强制类型转换很简单,不管类型什么类型都可以:Type b= (Type) a;c++中的类型转换 static_cast 静态类型转换。如int转换成char reinterpreter_cast 重新解释类型 dynamic_cast 命名上理解是动态类型转换。如子类...原创 2019-11-01 10:47:19 · 148 阅读 · 0 评论 -
设计一个数组模板类,完成对int、char、Teacher、Teacher*数据类型操作
模板类中应该包括:构造函数、析构函数、拷贝构造函数、重载[]、=、<<操作符//MyArray.h#pragma once#pragma warning(disable : 4996)#include <iostream>using namespace std;template <typename T>class MyArray{ fri...原创 2020-06-29 17:50:55 · 1036 阅读 · 2 评论 -
类模板语法总结
禁止滥用友元函数,友元函数只用来进行左移<<、右移>>操作符重载本质:模板是两次编译生成的,第一次生成的函数头和第二次生成的函数头不一样情况一:类模板中所有函数的声明和实现写在类的内部情况二:类模板中所有函数的声明与实现分离,写在同一.cpp中以上两种情况相同,构造函数和普通函数正常声明和实现,只需要单独处理全局变量友元函数。友元函数用来实现<&l...原创 2019-10-25 15:26:09 · 247 阅读 · 0 评论 -
类模板(泛型编程)
什么是类模板类似函数模板,淡化数据类型,使用通用数据类型的模板。对仅成员数据类型不同的类的抽象,比如,有两个或多个类,其功能是相同的,仅仅是数据类型的不同,那就可以声明为类模板。一般形式:template <typename 参数名1,typename 参数名2,...>template<typename T>class Test{ Test(...原创 2020-02-25 12:48:19 · 488 阅读 · 0 评论 -
函数模板机制探究(反汇编)
.cpp文件是一个高级语言,这种形式容易被读懂。为了在系统上运行.cpp程序,每条c++语句都必须转化为低级的机器指令。然后将这些指令打包成可执行目标文件格式,并以二进制形式存储在磁盘中gcc常用编译选项 选项 作用 -o 产生目标(.i、.s、.o、可执行文件等) -c 通...原创 2019-10-23 16:31:07 · 301 阅读 · 0 评论 -
函数模板(泛型编程)
函数模板什么是函数模板实际上是一种通用函数,其函数类型和参数类型不具体指定,用一个虚拟的类型来表示。这样的通用函数就是函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时系统会根据调用的实参类型来取代模板中的虚拟类型,从而实现不同函数的功能。为什么要有函数模板当开发中需要对多种类型做相同机制的操作时,函数模板可以减少...原创 2020-02-25 11:33:54 · 239 阅读 · 0 评论 -
函数指针做函数参数
//实现了任务的调用跟编写解耦合//在定义函数指针类型时提前对函数的参数,返回值做了约定(协议)#pragma warning(disable : 4996)#include <iostream>using namespace std;//任务实现int MyFunc(int a, int b){ printf("myfunc... %d\n", a + b);...原创 2019-10-22 17:17:34 · 221 阅读 · 0 评论 -
数组指针语法、函数指针语法整理
#pragma warning(disable : 4996)#include <iostream>using namespace std;int add(int a, int b){ printf("fun add ... %d\n", a + b); return a + b;}int main(){ //数组指针语法梳理 int a[10];...原创 2019-10-22 17:15:54 · 178 阅读 · 0 评论 -
纯虚函数和抽象类
什么是纯虚函数纯虚函数是一种特殊的虚函数,前面分析过虚函数,虚函数是virtual修饰的类的成员函数,可以有实现。而纯虚函数也和虚函数一样,用virtual来修饰的类的成员函数,但是只能有函数体不能有具体实现。一般格式:class <类名>{ virtual <类型><函数名>(<参数表>) = 0; ...}1...原创 2020-02-24 16:42:33 · 809 阅读 · 0 评论 -
父类指针和子类指针的步长
多态是用父类指针指向子类对象 和 父类步长++ 是两个不同的概念1、铁律1:指针也只一种数据类型,C++类对象的指针p++/--,仍然可用。2、指针运算是按照指针所指的类型进行的。p++ <==> p=p+1 //p = (unsigned int)basep + sizeof(*p) 步长。3、结论:父类p++与子类p++步长不同;不要混搭,不要用父类指针++方...原创 2019-06-02 21:18:12 · 269 阅读 · 0 评论 -
子类的vptr指针及证明vptr指针的存在
vptr指针会提前布局,可以通过sizeof()求类的大小class Parent1{public: Parent1(int a = 0) { this->a = a; print(); } virtual void print() { cout << "Parent1:" << a << endl; }private...原创 2019-06-02 21:17:40 · 782 阅读 · 0 评论 -
多态原理探究
多态1、存在继承2、子类重写父类函数 存在虚函数3、要有父类指针(引用)指向子类对象class Parent{public: Parent(int a = 0) { this->a = a; } virtual void Print()//1.动手脚 写virtual关键字 会特殊处理 //虚函数表 { cout << "Parent:...原创 2019-06-02 21:17:54 · 164 阅读 · 0 评论 -
静态联编和动态联编
联编是指一个程序模块、代码之间相互关联的过程静态联编是程序的匹配、连接在编译阶段实现,也称为早期匹配。重载函数使用静态联编动态联编指程序联编推迟到运行时进行,所以又称为晚期联编(迟绑定)。switch,if语句都是动态联编...原创 2019-05-26 21:46:59 · 318 阅读 · 0 评论 -
为什么要定义虚析构函数
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象class A{public: A() { p = new char[20]; strcpy(p, "A"); printf("A()\n"); } virtual ~A() { del...原创 2019-05-26 21:46:39 · 536 阅读 · 0 评论 -
构造函数中能调用虚函数,能实现多态吗?
1、对象在创建的时,由编译器对VPTR指针进行初始化2、只有当对象的构造完全结束后VPTR的指向才最终确定3、父类对象的VPTR指向父类虚函数表4、子类对象的VPTR指向子类虚函数表子类的vptr指针分步完成1、初始化c1.vptr指针,是分步完成的1->22、当执行父类的构造函数时,c1.vptr指针先指向父类的虚函数表,当父类的构造函数执行完毕后,会把c...原创 2019-06-02 21:18:04 · 629 阅读 · 1 评论 -
多态
多态成立的三个条件1、要有继承2、要有函数重写 虚函数3、要有父类指针(引用) 指向子类对象多态是设计模式的基础,多态是框架的基础1、C++中通过virtual关键字对多态进行支持2、使用virtual声明的函数被重写后即可展现多态特性class Cat{public: virtual int Power(){return 10;}};class Cat...原创 2019-05-26 21:46:28 · 156 阅读 · 0 评论 -
虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性class A{public: int a;};class A1:public A{public: int a1;};class A2:public A{public: int a2;};class B:public A1,public A2{public: int b;};...原创 2019-05-26 21:46:11 · 273 阅读 · 0 评论 -
多继承
1、一个类有多个直接基类的继承关系称为多继承2、 多继承声明语法class 派生类名: 访问控制 基类名1, 访问控制 基类名2, … , 访问控制 基类名n{ 数据成员和成员函数声明};3、类 C 可以根据访问控制同时继承类 A 和类 B 的成员,并添加自己的成员class A{//...};class B{//...};class ...原创 2019-05-26 21:46:00 · 1469 阅读 · 0 评论 -
继承中的static关键字
1、基类定义的静态成员,将被所有派生类共享2、根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 (遵守派生类的访问控制)3、派生类中访问静态成员,用以下形式显式说明:类名:: 成员或通过对象访问 对象名. 成员class A{public: //3.A类中添加构造函数 //A类的构造函数中 A的构造函数变成私有的时候 ...原创 2019-05-26 21:45:31 · 262 阅读 · 0 评论 -
重载、重写、重定义
重载1、只能出现在同一个类当中2、子类无法重载父类函数,父类中同名的函数会被子类中同名的函数覆盖3、重载是在编译期间根据函数参数和个数决定的重写1、必须发生在父类和子类当中2、子类对象中有和父类中同名的函数3、使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)class Parent{public: void GetName()...原创 2019-05-26 21:46:51 · 200 阅读 · 0 评论 -
继承中构造函数和析构函数以及组合混搭下的构造析构调用规则
1、先构造父类,再构造成员变量、最后构造自己2、先析构自己,在析构成员变量、最后析构父类3、先构造的对象,后释放class Object{public: Object(int _a,int _b) { a = _a; b = _b; cout<<"Object的构造函数"<<endl; }...原创 2019-05-26 21:45:21 · 206 阅读 · 0 评论 -
继承中的构造和析构&类型兼容性
兼容规则中所指的替代包括以下情况:1.子类对象可以当做父类对象使用2.子类对象可以直接赋值给父类对象3.子类对象可以直接初始化父类对象4.父类指针可以直接指向子类对象5.父类引用可以直接引用子类对象class Parent{public: Parent(){cout<<"父类构造函数"<<endl;} Parent(const ...原创 2019-05-26 21:45:41 · 556 阅读 · 0 评论 -
继承与派生
什么是继承面向对象中的一个概念。比如汽车是属于交通工具这个类别中的一种,那么就把汽车称为是交通工具的子类别,而交通工具称为汽车的父类别,这样他们之间就属于继承关系。这种继承关系使得子类具有父类的各种属性和方法,而不需要再编写或改变相同的功能。同时在子类中可以增加属于自己的属性和方法来完成自身功能需求和覆盖父类中原有的属性和方法,得到与父类不同的功能。基本语法:class 子类名:父类名表 ...原创 2020-02-22 18:11:17 · 162 阅读 · 0 评论 -
智能指针思想(简单了解)
什么是智能指针是C++的一个类模板,用对象去管理指针,想一想之前在使用指正的过程中,经常会出现内存泄漏和内存多次释放的问题,而智能指针使我们在项目开发中代替了C语言中原生的指针,保证开发更安全,更高效。例如 boost库的智能指针为什么要使用智能指针智能指针就是用来管理一个指针,在使用指针的过程中我们都遇到过,指针导致的内存泄漏和内存的多次释放,而智能指针可以很大程度上避免这些问题,它...原创 2020-02-21 23:25:28 · 312 阅读 · 0 评论 -
operator=、operator[]、operator()操作符重载
//释放当前旧的内存//根据新的对象分配新的内存大小//把新的值赋值给当前变量class Name{public: Name(const char *str) { m_len = strlen(str); cout << m_len << endl; s = new char[m_len+1]; strcpy(s, str); }...原创 2019-05-20 10:25:12 · 3758 阅读 · 0 评论 -
用成员函数和友元函数重载运算符
友元函数和成员函数选择1.当无法修改左操作数的类时,使用全局函数进行重载2.=、[]、()和->操作符只能通过成员函数进行重载用友元函数重载<<、>>操作符ostream& operator<<(ostream &out, Complex &c)istream& operator>>(istr...原创 2019-05-20 10:25:04 · 3499 阅读 · 0 评论 -
重载运算符(operator)
运算符重载的限制可以重载的运算符+ - * / % ^ & | ~! = < > += -= *= /= %=^= &= |= << >> >>= <<...原创 2019-05-20 10:24:57 · 1558 阅读 · 0 评论 -
友元函数和友元类(friend)
关键字 friend(破坏了类的封装性)class MyFriend{ //友元类(破坏了类的封装性) friend class MyClass;public: MyFriend(int a=0, int b=0) { m_a = a; m_b = b; } //友元函数通过对象参数访问私有数据成员 friend void FriendFun(MyFriend *f...原创 2019-05-05 09:29:52 · 864 阅读 · 0 评论 -
const成员变量、const成员函数
///////////void Fun(int a,int b)const{ //}请问const修饰的是谁void Fun(ing a,int b)const <==> void Fun(const ClassName *const this,int a,int b)//const 写在什么位置没有关系//const 修饰的是谁//const 修...原创 2019-05-05 09:29:44 · 773 阅读 · 0 评论 -
this指针
class Test{public: Test(int a,int b)//Test(Test *const this,int a,int b) { this->a = a; this->b = b; } void Print()//void Print(Test *const this) { ...原创 2019-05-05 09:29:36 · 214 阅读 · 0 评论 -
静态成员变量和静态成员函数(Static)
关键字static可以用于说明一个类的成员,静态成员提供了一个同类对象的共享机制把一个类的成员说明为static时,这个类无论有多少个对象被创建,这些对象共享之个static成员class Test{public: Test(int a = 0) { m_a = a; } int GetC() { return ...原创 2019-05-05 09:29:25 · 1076 阅读 · 0 评论 -
对象的动态建立和释放(new&delete)
C:malloc freeC++: new delete在c语言中malloc只会分配内存大小,不会调用类的构造函数,free不会调用类的析构函数//////////////////////////main//cint *p = (int *)malloc(sizeof(int));*p = 10;free(p);int *a = (int *)malloc(size...原创 2019-05-05 09:29:15 · 1339 阅读 · 0 评论 -
构造函数的初始化例表
在B类中 组合一个A类的对象(A类设计了构造函数)根据构造函数的调用规则 设计A的构造函数,必须要用 没有机会初始化A新的语法 Constructor::Constructor():m1(v1),m2(v1,v2),m3(v2)类成员中若有const修饰,必须在对象初始化的时候,给const int c 赋值当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始...原创 2019-03-17 17:16:04 · 194 阅读 · 0 评论