c++学习笔记
文章平均质量分 63
为成大道踏平坎坷
这个作者很懒,什么都没留下…
展开
-
mysql的C语言api函数
这节主要是介绍MySQL的api函数,使用这些api函数可以完成C语言操作MySQL数据库。初始化连接环境//参数 mysql为null//返回值:用于连接MySQL服务器MYSQL* mysql_init(MYSQL* mysql);连接MySQL服务器//返回值与第一个参数类型相同MYSQL* mysql_real_connect( MYSQL* mysql, // mysql_init函数的返回值 const char* host, // mysql服务器的ip地址原创 2022-05-21 09:21:49 · 265 阅读 · 0 评论 -
现代C++02:手动实现智能指针
自己动手实现智能指针上一讲实现的类class shape_wrapper{public: explicit shape_wrapper(shape* ptr=nullptr):ptr_(ptr){} ~shape_wrapper(){delete ptr_;} shape* get() const {return ptr_;}private: shape* ptr_;};该对象析构的时候,会对超出作用域的对象进行释放。但是存在缺点:这个类只适用于shape原创 2021-09-29 17:17:26 · 256 阅读 · 0 评论 -
现代C++01堆、栈、RAII:C++里该如何管理资源?
堆、栈、RAII:C++里该如何管理资源?基本概念堆英文名heap,指的是动态内存分配的区域,并不是数据结构中的堆。这里的内存创建完成后需要手动释放,否则就会造成内存泄漏。自由存储区free store特指使用new和delete来释放和分配的区域,一般而言,这是堆的子集,因为new和delete底层调用了malloc和free,而malloc和free操作的区域是堆区域,所以free store也是堆栈英文名stack,指的是函数调用过程中产生的本地变量和调用数据的区域。这个栈与数据结构中的原创 2021-09-27 10:47:53 · 189 阅读 · 0 评论 -
c++11新特性之独占指针unique_ptr
独占智能指针unique_ptr独占智能指针不允许其他智能指针共享内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr。unique_ptr不允许复制,但可以通过函数返回其他的unique_ptr,还可以通过move来转义给其他的unique_ptr,这样原始的所有权就被转移了,这个原始指针还是被独占的。unique_ptr<int> func() { return unique_ptr<int&g原创 2021-09-26 20:24:46 · 781 阅读 · 0 评论 -
c++11新特性之智能指针shared_ptr
shared_ptr的初始化通过构造函数初始化#include<iostream>#include<memory>using namespace std;int main() { //使用智能指针管理一块int类型的堆内存 shared_ptr<int> ptr1(new int(520)); cout << "ptr1的引用计数为:" << ptr1.use_count() << endl; //使用智能指针管理原创 2021-09-26 18:51:55 · 431 阅读 · 0 评论 -
设计模式之单例模式
写一个单例模式单例模式:顾名思义就是这个类只能创建一个对象。让用户调用你的方法,创建对象,而不是通过类名的方法来创建对象。class Singleton {public: ~Singleton() { cout << "Singleton() destruct" << endl; } Singleton* CreateObject() { return new Singleton(); }private: Singleton() { cout <原创 2021-09-13 18:51:31 · 174 阅读 · 0 评论 -
c++对象模型05:虚继承内存布局
虚继承虚继承解决了菱形继承中最派生类拥有多个间接父类实例的情况。虚继承的派生类的内存布局与普通继承很多不同,主要体现在:虚继承的派生类,如果定义了新的虚函数,则编译器为其生成一个虚函数指针(vptr)以及一张虚函数表。该vptr位于对象内存最前面。(非虚继承时,派生类新的虚函数直接扩展在基类虚函数表的下面。)虚继承的派生类有单独的虚函数表,基类也有单独的虚函数表,两部分之间用一个四个字节的0x00000000来作为分界。虚继承的派生类对象中,含有四字节的虚基表指针。在C++对象模型中,虚继承而原创 2021-08-07 16:32:40 · 3438 阅读 · 9 评论 -
c++对象模型04:菱形继承内存布局
菱形继承菱形继承也称为钻石型继承或重复继承,它指的是基类被某个派生类简单重复继承了多次。这样,派生类对象中拥有多份基类成员实例,这会占据更多的内存空间,还会引起调用基类成员时的二义性。代码class B { public: int ib; public: B(int i=1) :ib(i){} virtual void f() { cout << "B::f()" << endl; } virtual void Bf(原创 2021-08-07 16:21:42 · 503 阅读 · 0 评论 -
c++对象模型03:多重继承内存布局
多继承单继承中(一般继承),派生类会扩展基类的虚函数表。在多继承中,派生类含有多个基类的对象,该往哪个基类的虚函数表扩展呢?当派生类重写了基类的函数,需要覆盖多个基类的虚函数表吗?每个基类都有自己的虚函数表派生类的虚函数被放在声明的第一个基类的虚函数表中。重写时,所有基类的同名函数都被派生类的同名函数覆盖。保证了基类指针指向派生类对象时,总是能够调用到真正的函数。内存布局中,基类按照其声明顺序排列。代码class Base{public: Base(int i) :ba原创 2021-08-07 16:17:24 · 716 阅读 · 0 评论 -
c++对象模型02:单继承内存布局
单继承派生类的定义class Derive : public Base{public: Derive(int d) :Base(1000), DeriveI(d) {}; //overwrite父类虚函数 virtual void print(void) { cout << "Drive::print_overwrite"; } // Derive声明的新的虚函数 virtual void Drive_print() { cout << "Drive::Drive_原创 2021-08-07 16:14:49 · 177 阅读 · 0 评论 -
c++对象模型01:三种常见对象模型
对象模型在C++中,有两种数据成员(class data members):static 和nonstatic,以及三种类成员函数(class member functions):static、nonstatic和virtual:接下来我们看三种对象模型是如何存放数据的简单对象模型在该模型下,对象由一系列的指针组成,每一个指针都指向一个数据成员或成员函数,顺序按声明顺序排列,也就是说,每个数据成员和成员函数在类中所占的大小是相同的,都为一个指针的大小。表格驱动对象模型把成员函数放在一个成员函原创 2021-08-07 16:09:57 · 753 阅读 · 0 评论 -
虚函数与虚函数指针
虚函数虚函数的作用是什么?主要是为了实现多态机制,是指在继承层次中基类的指针可以具有多种不同指向,即当基类指针指向某个派生类对象时,通过基类指针可以调用到派生类的函数,而不是基类的函数。代码演示class Base { virtual void print(void); }class Drive1 :public Base{ virtual void print(void); }class Drive2 :public Base{ virtual void p原创 2021-08-07 16:02:19 · 881 阅读 · 0 评论 -
C++Primer练习题
练习5.5 写一段自己的程序,使用if else语句实现把数字成绩转换为字母成绩的要求#include <iostream>#include<vector>#include<string>using namespace std;int main() { int grade = 0; cin >>grade; const vector<string>scores = { "F","D","C","B","A","A++" };原创 2020-11-17 17:32:47 · 819 阅读 · 0 评论 -
C++学习笔记08:求质数
使用三种循环结构,求出1-100的质数。for循环#include <iostream>using namespace std;int main(){ int flag = 0, i, j; for (i = 2; i < =100; i++) { flag = 1; for (j = 2; j < i;j++) if (i % j == 0)...原创 2019-07-31 17:08:37 · 1107 阅读 · 0 评论 -
C++学习笔记29:数组定义和初始化
数组:具有一定顺序关系的若干对象的集合体。数组元素:组成数组的对象.n维数组:每个元素有n个下标的数组。数组定义和使用定义语法形式:类型说明符 数组名[常量表达式][常量表达式].....;数组名的构成方法与一般变量名相同。例如:int a[10];//表示a为整型数组,有10个元素:a[0]...a[9]例如: int a[5][3];//表示a为整型二维数组,其中第一维有5...原创 2019-08-22 23:44:43 · 386 阅读 · 0 评论 -
C++学习笔记30:数组作函数参数和对象数组
之前的绝大多数学习笔记基本上是在抄书和抄笔记,本质上失去了写博客的意义,所以此篇以后需要按照自己的理解和想法来写。最初的版本可以不够严谨准确,但是后续肯定会继续更新自己的理解,确保内容的完整和准确。数组作函数参数数组作为函数实参的时候可以有两种情况,一种是使用数组的元素作为实参,另一种是使用数组名作为实参。数组元素作实参这种情况和相同类型的其他单个变量是一样的。数组名作实参此时,形实结...原创 2019-08-29 11:39:22 · 841 阅读 · 0 评论 -
C++学习笔记31:基于范围的for循环
自动将数组中的元素全部遍历一次。直接举例比较,要求:将数组中的每个元素+2输出//传统做法int main(){ int arry[3]={1,2,3}; int *p; for(p=arry;p<(arry+sizeof(arry)/sizeof(int);p++) { *p+=2 cout<<*p<<endl; }}//基于范围的f...原创 2019-08-29 12:32:12 · 147 阅读 · 0 评论 -
C++学习笔记32:指针
概念内存空间的访问形式有两种,第一种就是通过变量名访问,这是最常见的访问方式;第二种就是通过指针直接访问内存地址。指针:内存地址,用来间接访问内存单元。指针变量:指针所指向地址内储存的变量。指针运算符寻址运算符*:代表该指针指向内存地址的内容。取址运算符&:代表该变量内存空间的地址。两者互为逆运算static int i;static int * p=&i;//左...原创 2019-08-30 00:16:04 · 177 阅读 · 0 评论 -
C++学习笔记33:指针运算
主要是算术运算和关系运算算术运算指针与整数的加减运算指针的++、–运算指针的加减运算相当于将指针指向的地址向前或向后移动相应整数个位置。指针算术运算的结果值取决于指针指向的数据类型,总是指向一个完整数据的首地址。关系运算指向相同数据类型的指针之间可以进行各种关系运算,而指向不同数据类型指针之间或与非零整数之间的关系运算没有意义。指针可以与0之间进行等于或不等于的关系运算。...原创 2019-08-30 00:46:51 · 169 阅读 · 0 评论 -
C++学习笔记34:用指针访问数组元素和指针数组
指针访问数组元素指针的运算本身就是适合对连续的数据进行处理,而数组正好满足这一要求。所以这一节研究如何使用指针访问数组元素。首先我们举个例子int a[10],*p;//定义一个数组和一个指针变量pp=a;//或者p=&a[0];这两句话的意思都是将数组a的首地址赋值给p等效形式*p就是a[0],是寻址运算符,就是找到p变量中保存的地址里面的内容,即数组a的第一个元素。同理...原创 2019-08-30 18:43:50 · 3370 阅读 · 0 评论 -
C++学习笔记35:指针作函数参数、指针型函数和指向函数的指针
用指针作函数参数作用使实参与形参指针指向共同的内存空间,达到双向传递的目的。(引用也可达到同样的效果)减少函数调用时数据的开销通过指向函数的指针传递函数代码首地址。例:输入三个浮点数,分离出整数部分和小数部分。#include<iostream>using namespace std;void splitfloat(float x, int* intpart, fl...原创 2019-08-31 00:22:47 · 257 阅读 · 0 评论 -
C++学习笔记36:对象指针
用于存放对象地址的变量。语法形式类名 * 对象指针名;访问对象成员的语法形式对象指针名-> 成员名 //与(*对象指针名).成员名 等价例 使用指针访问point类的成员。//6_12.cpp#include <iostream>using namespace std;class Point { //类的定义public: //外部接口 Point(i...原创 2019-08-31 18:02:12 · 146 阅读 · 0 评论 -
C++学习笔记37:动态内存分配
动态内存分配技术可以保证程序在运行过程中按照实际需要申请适量的内存,使用结束后可以释放,这种在程序运行过程中申请和释放的存储单元称为堆对象,申请和删除过程一般称为建立和删除建立堆对象语法形式new 数据类型 (初始化参数列表);运行该语句申请分配用于存放指定类型数据的内存空间,并依据初始化列表中给出的值进行初始化。如果申请成功,new运算便返回一个指向新分配内存首地址的类型的指针,可以通...原创 2019-08-31 22:37:00 · 191 阅读 · 0 评论 -
C++学习笔记38:vector对象
作用:封装任何类型的动态数组,自动创建和删除,数组下标越界检查。语法形式vector<元素类型>数组对象名(数组长度);例int x=10; vector<int>arr(x)表示定义了一个大小为10的int型动态数组对象arr。对数组元素的引用与普通数组具有相同的形式vector对象名[下表表达式]vector数组对象名不表示数组首地址,用size函数获取数...原创 2019-09-01 00:35:27 · 160 阅读 · 0 评论 -
C++学习笔记39:浅层复制和深层复制
浅层复制实现对象间数据元素的一一对应复制。例 先建立一个对象数组,再使用默认复制构造函数产生,//6_21.cpp#include <iostream>#include <cassert>using namespace std;class Point {public: Point() : x(0), y(0) { cout<<"Defau...原创 2019-09-09 17:03:14 · 523 阅读 · 0 评论 -
C++学习笔记40:C风格字符串和string类
C风格字符串从C语言继承过来的,用字符数组存放字符串。例:‘program’各字符连续顺序存放,每个字符占一个字节,以‘\0’结尾,相当于一个隐含创建的字符常量数组。‘program’出现在表达式中,表示这一char数组的首地址。首地址可以赋值给char常量指针。const char *STRING1=“program”string类常用构造string();//默认建立一个长度...原创 2019-09-09 19:03:18 · 235 阅读 · 0 评论 -
C++学习笔记28:类的静态数据成员和常数据成员的定义和初始化
待完善原创 2019-08-18 10:35:49 · 1141 阅读 · 0 评论 -
C++学习笔记27:多文件结构
组织结构一个工程可以划分为多个源文件:类声明文件(.h 文件)类实现文件(.cpp 文件)类的使用文件( main() 所在的 .cpp 文件)利用工程来组合各个文件。外部变量如果一个变量除了在定义它的源文件中可以使用外,还能被其它文件使用,那么就称这个变量是外部变量。文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用这一变量,需要用 extern 关...原创 2019-08-17 17:50:31 · 517 阅读 · 0 评论 -
C++学习笔记17:面向对象程序设计的特点与类的定义
面向对象的程序设计的特点:抽象、封装、继承和多态。抽象指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述。包含两个方面,分别是数据抽象和行为抽象。数据抽象:描述某类对象的属性和状态行为抽象:描述某类对象的共同行为或功能特征。举例:当把人作为一个类的时候,人的属性如名字、年龄、性别等就是数据抽象,而比如工作、学习、吃饭睡觉这些属于行为抽象。封装将抽象得到的数据和行为相结...原创 2019-08-15 12:51:23 · 225 阅读 · 0 评论 -
C++学习笔记16:constexpr函数和系统函数
constexpr函数语法规定constexpr修饰的函数在所在参数都是constexpr时,一定返回constexpr;函数体中必须有且仅有一条return语句。constexpr 函数举例constexpr int get_size() { return 20; }constexpr int foo = get_size(); //正确:foo 是一个常量表达式C++ 系统函...原创 2019-08-13 18:12:05 · 210 阅读 · 0 评论 -
C++学习笔记15:重载函数
重载函数两个以上得函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。注意重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参与形参的类型及个数的最佳匹配来选择调用哪一个函数。不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。例 编写两个名为sumofsquare的重载函数,分别求两整数的...原创 2019-08-13 16:28:00 · 609 阅读 · 0 评论 -
C++学习笔记14:带默认参数值的函数
带默认参数值的函数默认形参值:函数在定义时可以预先声明默认的形参值。调用时如果给出实参,则用实参初始化形参;如果没有给出实参,则采用预先声明的默认形参值。说明次序有默认参数的形参值必须列在形参表的最右,即默认参数值的右边不能有无默认值的参数调用时实参与形参的结合次序是从左向右默认参数值与函数的调用位置如果一个函数有原型声明,且原型声明在定义之前,则默认形参值在原型声明中给出;如...原创 2019-08-13 15:49:21 · 703 阅读 · 0 评论 -
C++学习笔记07:运算流程控制
运算流程控制即程序执行时的条件结构和循环结构,下面介绍具体的几种结构:单路和双路单路分支if(表达式) 语句序列双路分支if(表达式) 语句序列1else 语句序列2注:表示条件的表达式要能判断真假。当语句序列只有一句时,可以省略花括号。分支嵌套if(表达式1) 语句序列1;else if(表达式2) 语句序列2;else if(表达式3) 语句序列3...原创 2019-07-28 19:11:39 · 157 阅读 · 0 评论 -
C++学习笔记03:算术运算和自增自减运算
进行算术运算时要注意的三点:乘法运算符不能省略除数是表达式时,注意加括号没有乘方/指数/对数/三角函数的运算符,只能通过再程序开头写#include <cmath> 通过函数调用来实现。自增自减运算单目运算,当运算符前置时,表达式的值为加或减后的结果;当运算符后置时,表达式的值为加或减之前的结果。int a=5,b=10,m,n,;m=a++;n=b++;cout...原创 2019-07-22 23:35:16 · 245 阅读 · 0 评论 -
C++学习笔记09:打印 n 阶实心菱形
C2-3实心菱形 (100/100 分数)题目描述打印 n 阶实心菱形输入描述输入一个整数n,0 < n <= 10输出描述输出 n 阶实心菱形 , 占 2*n-1 行样例输入3样例输出 * ******** *** *解题#include <iostream>using namespace std;int main(){...原创 2019-08-04 16:16:32 · 1490 阅读 · 0 评论 -
C++学习笔记02:常量和变量
常量常量的值不能改变,可以分为字面常量和符号常量。字面常量即直接写出来的数据。符号常量有两种写法:第一种写法:在main函数前,按下面代码书写,注意末尾没有分号,称为编译预处理。#define<符号名称> <数据>#define<N> <100>第二种写法:使用const,写法如下,是语句,末尾要有分号。const <类型说明符&...原创 2019-07-21 20:03:15 · 148 阅读 · 0 评论 -
C++学习笔记06:位运算
位运算只能对整数进行。分类按位与&对应的两位都为1,结果才为1按位或|对应的两位有一个1,结果为1,都为0时,结果为0按位异或^两个操作数不同,结果为1,相同为0.移位运算将二进制数的每一位向左或向右移动指定的数位。结果:移到外面的舍去,不足的补零。左移<<:左移一位相当于乘以2右移>>:右移一位相当于除以2以上运算皆为双目运算。<整...原创 2019-07-25 00:48:06 · 119 阅读 · 0 评论 -
C++学习笔记01:数据类型
C++中常见的数据类型有整型,实数型,字符型,字符串型,逻辑型,转义字符。这些数据类型在计算机中有不同的表现形式,不同的存储空间。那么如何得知不同数据类型所占的存储空间呢?sizeof(<类型名>);//类型占字节数sizeof(<数据>);//数据占字节数```![在这里插入图片描述](https://img-blog.csdnimg.cn/2019072011...原创 2019-07-20 11:07:41 · 133 阅读 · 0 评论 -
C++学习笔记05:逻辑运算
原创 2019-07-24 16:54:27 · 189 阅读 · 0 评论 -
C++学习笔记18:对象和成员函数
对象类的对象就是该类的某一特定实例。声明对象的方式类名 对象名;访问对象成员的方法数据成员:对象.数据成员名函数成员:对象.函数成员名(参数表)在类的外部只能访问到类的公有成员;在类的成员函数中,可以访问到类的全部成员。类的成员函数实现语法返回值类型 类名::函数成员名(参数表){ 函数体}成员函数调用的目的对象调用一个成员函数与调用普通函数的差异在于,使用“...原创 2019-08-15 19:06:56 · 567 阅读 · 0 评论