![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
cpp
schedule___
这个作者很懒,什么都没留下…
展开
-
智能指针
自定义智能指针#include <iostream>using namespace std;class Person {public: int m_age; Person(int age) :m_age(age) { cout << "Person(int age)" << endl; } Person(const Person& per) :m_age(per.m_age) { cout << "Person(const Perso原创 2021-06-27 23:18:32 · 99 阅读 · 0 评论 -
类型转换 double的存储
类型转换c语言风格(type) expressiontype (expression)c++风格static_castdynamic_castreinterpret_castconst_cast 使用: xx_cast <type>(expression)const_cast#include <iostream>using namespace std;class Person {};int main() { const原创 2021-06-27 15:35:15 · 96 阅读 · 0 评论 -
运算符重载
#include <iostream>using namespace std;class Point { int m_x; int m_y;public: Point(int x=0,int y=0):m_x(x),m_y(y) {} void display()const ; // &防止产生临时对象 Point& operator+=(const Point& p1); // 第一个const,返回常量 不能 (p1+p2)=p3 // 第二个原创 2021-06-26 18:22:02 · 75 阅读 · 0 评论 -
内部类 局部类
内部类如果将类A定义在类C的内部,那么类A就是一个内部类(嵌套类)内部类的特点支持public、protected、private访问权限成员函数可以直接访问其外部类的所有成员(反过来不行)成员函数可以直接不带类名、对象名访问外部类的static成员不会影响外部类的内存布局可以在外部类内部声明,在外部类外部定义局部类在一个函数内部定义的类,称为局部类局部类的特点作用域仅限所在函数内部其所有成员必须定义在类内部,不允许定义static成员成员函数不能直接访问函数的局部变原创 2021-06-24 23:11:44 · 64 阅读 · 0 评论 -
友元 友元类
#include <iostream>using namespace std;class Point { //只能是成员函数 Math::point 不行 //friend Point add(Point p1, Point p2); friend class Math; int m_x; int m_y;public: Point(int x=0,int y=0):m_x(x),m_y(y) {} void display() { cout << "("原创 2021-06-24 23:00:20 · 56 阅读 · 0 评论 -
编译器自动生成构造函数
c++编译器在某些特定情况下,会给类自动生成无参的构造函数成员变量在声明时进行了初始化有定义虚函数虚继承其他类包含了对象类型的成员,且这个成员有构造函数(编译器生成或自定义)父类有构造函数(编译器生成或自定义)...原创 2021-06-24 22:09:54 · 168 阅读 · 0 评论 -
拷贝构造函数
调用父类拷贝构造#include <iostream>using namespace std;class Person {public: int m_age; Person(int age) :m_age(age) {} Person(const Person& person) :m_age(person.m_age) {}};class Student:public Person {public: int m_score; Student(int age,i原创 2021-06-24 12:22:11 · 66 阅读 · 0 评论 -
数组与指针
const char *name ="youyuo" sizeof(name) = 4; //x86 strlen(name) = 6;char array[] = "youyou" sizeof(array) = 7; //x86 strlen(array) = 6;原创 2021-06-24 11:33:09 · 78 阅读 · 0 评论 -
const成员变量、函数
const成员被const修饰的成员变量、非静态成员函数const成员变量必须初始化(类内初始化),可以在声明的时候直接初始化赋值非static的const成员变量还可以在初始化列表中初始化const成员函数(不能是静态)const关键字放在参数列表后面,函数声明和实现都必须带const 内部不能修改非static成员变量 内部只能调用const成员函数、static成员函数 非const成员函数可以调用const成员函数const成员函数和非co原创 2021-06-23 14:44:47 · 152 阅读 · 0 评论 -
static成员变量、函数及其应用
静态成员被static修饰的函数或变量可以通过对象、指针、类名访问不依赖对象静态成员变量相当于全局变量设置了访问权限类内声明,类外初始化。初始化时不带static;如果类的声明和实现分离,在实现中初始化静态成员函数没有this指针。(this只能用在 非静态 成员函数 类)内部只能访问静态成员函数和变量声明和实现分离时,实现不带static构造、析构不能是静态的;虚函数不能是静态的...原创 2021-06-23 13:15:45 · 151 阅读 · 0 评论 -
多继承 菱形继承 虚继承
菱形继承菱形继承带来的问题 最底层子类从基类中继承的成员变量冗余、重复。 最底层子类访问基类成员变量有二义性。虚继承 解决多继承属性之间的重复问题 虚函数是为了实现多态#include <iostream>using namespace std;struct Person{ int m_age; //virtual void run() = 0; void fun() { cout << "P原创 2021-06-22 13:14:56 · 74 阅读 · 0 评论 -
虚析构 抽象类
虚析构父类指针指向子类对象时 Base *p = new Son(), delete p 如果析构函数不是虚函数,则只会调用父类析构函数,可能会造成只释放一部分空间。 如何是虚析构,则先调用子类析构,然后调用父类析构。抽象类纯虚函数没有函数体且初始化为0的虚函数,用来定义接口规范抽象类含有纯虚函数的类,不可以实例化(不能创建对象)抽象类也可以包含非纯虚函数,成员变量如果父类是抽象类,子类没有完全重写纯虚函数,那么这个子类依然是抽象类...原创 2021-06-21 22:13:02 · 105 阅读 · 0 评论 -
汇编分析多态 虚函数表
多态默认情况下,父类指针指向子类对象,只能调用父类中的函数。 Animal *p = new Dog指针p只能调用Animal类中的函数#include <iostream>using namespace std;class Animal {public: void speak() { cout << "animal speak()" << endl; } void run() { cout << "animal ru原创 2021-06-21 17:02:35 · 185 阅读 · 0 评论 -
汇编分析 构造函数相互调用
在{}中调用class Person {public: int m_age; int m_id; Person() { //创建了一个临时对象 Person(10, 20); } Person(int age,int id) { this->m_age = age; this->m_id = id; }}; Person(10, 20);0084206D push 14h 0084206F push 0Ah //.原创 2021-06-19 17:25:41 · 119 阅读 · 0 评论 -
初始化列表
初始化列表初始化顺序只跟成员声明顺序有关初始化列表与函数默认参数配合使用函数声明与实现分离是 初始化列表只能放在函数实现中 默认参数只能放在函数声明中原创 2021-06-19 16:34:08 · 71 阅读 · 0 评论 -
构造函数 析构函数 内存布局
构造函数与析构函数构造函数:初始化对象内存空间析构函数:释放堆空间必须public才能访问原创 2021-06-19 12:46:28 · 155 阅读 · 0 评论 -
误将函数声明当做定义对象
函数声明的坑#include <iostream>using namespace std;#include <cstdlib>class Person {public: int m_age; Person() { cout << "Persson" << endl; } Person(int a):m_age(a) { cout << "Preson(int a) -> " << m_age <&原创 2021-06-19 10:48:45 · 58 阅读 · 0 评论 -
malloc new 时 堆空间初始化;是否调用构造函数
malloc free//void *malloc(size_t size) //类型 大小char *p = (char *)malloc(4);free(p)new delete// new + 类型int *p = new int;delete p;new[] delete[]//分配数组加[]char *p = new char[4];delete[] p;new初始化int *p1 = new int; //未.原创 2021-06-18 16:37:34 · 532 阅读 · 0 评论 -
通过对象、指针调用函数时this指针的情况
#include <iostream>using namespace std;class Person {public: int m_id; int m_age; int m_height; void display() { //mov eax,dword ptr[this] //[eax] cout << "m_id :" << m_id //[eax+4] << "\nm_age:" << m_age //[e原创 2021-06-18 15:34:24 · 161 阅读 · 0 评论 -
this指针将对象的属性和方法关联起来(汇编分析this)
类c++中可以用struct、class定义一个类 struct默认权限是public l;class默认权限是private对象模型属性存放在对象中;方法存放在代码区this指针函数在代码区,属性在对象中(栈、堆)。函数中有this指针,这样就能完成访问。 this指针就是函数的隐式参数,存储函数调用者的地址。...原创 2021-06-18 12:24:02 · 123 阅读 · 0 评论 -
引用(reference)
引用注意引用就是变量的别名引用必须初始化,一旦指向了某个变量,就不可以改变指向#include <iostream>using namespace std;int main(){ int age = 10; int height = 110; int& refAge = age; refAge = 11; cout << age << endl;//注意区分,这里不是改变指向 refAge = height; refAg原创 2021-06-15 22:18:49 · 208 阅读 · 0 评论 -
const
const与指针指针int age =1;int *P =&age;/*指针: 指针的地址&p 指针指向的内容*p、age变量: 变量的地址&age,p 变量:age,*p*/const修饰右边的东西int age =10;//p1、p2(指针)不是常量;*p4、*p5(指针指向的内容)是常量cosnt int *P1 = &age;int const*P2 = &age;//p3(指针)是常量;*p3(指针指向的内容)不是原创 2021-06-15 21:22:33 · 71 阅读 · 0 评论 -
内联函数(inline function) ;宏函数
内联函数使用inline修饰函数声明和实现,可以使其变成内联函数建议:声明和实现都加上inline特点编译器直接将函数调用展开为函数代码。可以减小函数调用的开销(堆栈)会增加代码体积注意尽量不要inline超过10行的代码函数有些函数即使声明为inline,也不会编译为内联,比如递归函数。内联函数与宏相同内联函数和宏都可以减小函数调用的开销不同内联函数多了语法检测和函数的特性#include <iostream>usi原创 2021-06-15 20:35:03 · 108 阅读 · 0 评论 -
extern “C“
extern “c”被extern "c"修饰的代码会按照c语言的方式编译如果函数同时有声明和实现,要让函数声明被 extern "C"修饰,函数实现可以不被修饰extern "C" void fun() { cout << "fun()" << endl;}extern "C" void fun(int c) { cout << "fun(int c)" << endl;}//另一种写法extern "C" { void fun()原创 2021-06-15 18:07:59 · 212 阅读 · 0 评论 -
函数重载(overload) 默认参数
函数重载规则函数名相同参数个数、类型、顺序不同注意返回值类型与函数重载无关调用函数时,实参的隐式类型转换可能会产生二义性。本质采用了name mangling 或者叫name decoration的技术c++编译器会对符号名(函数名)进行改变、修饰不同编译器(MSVC,g++)有不同的生成规则通过ida打开 [vs_release_禁止优化]可以看到默认参数规则默认参数只能按照从右到左的顺序函数同时有声明和实现,默认参数只能放到函数声明中默认参数的值可以是常量原创 2021-06-15 15:22:23 · 177 阅读 · 0 评论 -
顺序容器相关操作
初始化、赋值 添加、删除、访问 查看、修改容器大小向一个deque,vector,或string插入元素会使所有指向容器的迭代器,引用,指针失效。删除deque中除收尾位置之外的任何元素都会使迭代器,引用,指针失效;指向vector,string中除删除点之后位置的迭代器,引用,指针都会失效。连续添加或删除时,注意迭代器是否有效,用erase insert 更新迭代器。#include <iostream>#include <vector>int main(原创 2021-04-22 17:29:56 · 59 阅读 · 0 评论 -
使用 istringtream 注意其状态
#include <iostream>#include <fstream>#include <sstream>#include <vector>#include <string>using namespace std;int main(int argc,char *argv[]){ ifstream in(".\\test.cpp"); if(!in) { cerr<<"文件无法打原创 2021-04-20 14:48:18 · 167 阅读 · 0 评论 -
cin相关函数
cincin的相关函数 get getline >> ignorecin cout 都关联一个行缓冲区。按下enter键,生成一个’\n’ 在缓冲区中,同时也就可以操作这一行了。cin.get() 从缓冲区取一个字符。cin.getline() 从缓冲区取一行。>> 在缓冲区中读取一个>> 后面类型的内存大小。不会读入空格,遇到空格就不读了。cin.ignore()cin.ignore(num,ch) //从输入流cin中提取num个字符,遇到ch则停止原创 2021-04-19 14:39:25 · 504 阅读 · 0 评论 -
Windows路径名的坑
Windows 下路径为 \unix 下为 /int main(int argc,char *argv[]){ string name(".\test.cpp"); //\t ifstream in(argv[1]); cout<<argv[1]<<endl; cout<<name<<endl; }所以为用name打开文件一直打不开。应使用·string name(".\\test.cpp") 才能打开。原创 2021-04-19 17:19:07 · 70 阅读 · 0 评论