![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从零开始学C++
Sandeldeng
这个作者很懒,什么都没留下…
展开
-
从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
一、bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。 声明方式:bool result; result=true; 可以当作整数用(true一般为1,false为0) 把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false,注意会发生截断。二、const 限定符 (1)、用c转载 2016-10-24 23:53:19 · 654 阅读 · 0 评论 -
从零开始学C++之标准库类型(二):vector 类简介和例程
一、标准库的vector类型 vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个类模板(class template) vector不能存放引用。template < class Type, class Allocator = allocator<Type> >class vector要使用vector转载 2016-10-25 20:57:49 · 330 阅读 · 0 评论 -
从零开始学C++之标准库类型(三):map 类简介和例程
一、标准库的map类型 使用map得包含map类所在的头文件template < class Key, class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> > >class map#include <map> 定义一个map对象: map<st转载 2016-10-25 21:14:18 · 382 阅读 · 0 评论 -
从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别
一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。 继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。 新类称为派生类或子类,原有类称为基类或父类 派生类是基类的具体化(一)、派生类的声明语法为:c转载 2016-10-25 21:27:57 · 429 阅读 · 0 评论 -
从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。 派生类的构造函数需要给基类的构造函数传递参数#include <iostream>using n转载 2016-10-25 22:11:41 · 527 阅读 · 0 评论 -
从零开始学C++之继承(三):多重继承、虚继承与虚基类
一、多重继承单重继承——一个派生类最多只能有一个基类 多重继承——一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,…. {….}; 派生类同时继承多个基类的成员,更好的软件重用 可能会有大量的二义性,多个基类中可能包含同名变量或函数多重继承中解决访问歧义的方法:基类名::数据成员名(或成员函数(参数表)) 明确指明要访问定义于哪个基类中的成员#includ转载 2016-10-25 22:18:10 · 463 阅读 · 0 评论 -
从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
一、多态 多态性是面向对象程序设计的重要特征之一。 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。 多态的实现: 函数重载 运算符重载 模板 虚函数 (1)、静态绑定与动态绑定 静态绑定 绑定过程出现在编译阶段,在编译期就已确定要调用的函数。 动态绑定 绑定过程工作在程序运行时执行,在程序运行时才确定将要调用的函数。二、虚函数 虚函数的概念:在基类转载 2016-10-25 22:34:48 · 387 阅读 · 0 评论 -
从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
一、纯虚函数 虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 定义纯虚函数:class 类名{ virtual 返回值类型 函数名(参数表) = 0;};纯虚函数不需要实转载 2016-10-25 22:46:34 · 487 阅读 · 0 评论 -
从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)
首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n)所指定的值)的整数倍。 整个结构体也要对齐,结构体总大小对齐至各个min中最大值的整数倍。 win32 可选的有1, 2, 4, 8, 16 linux 32 可选的有1, 2, 4 类的转载 2016-10-26 08:23:52 · 535 阅读 · 0 评论 -
从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
一、RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution.There are three main C++ language elements to run-time type informati转载 2016-10-26 09:05:24 · 370 阅读 · 0 评论 -
从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一、C语言错误处理方法 1、返回值(if … else语句判断错误) 2、errno(linux 系统调用) 3、goto语句(函数内局部跳转) 4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. )#defin转载 2016-10-26 09:19:53 · 498 阅读 · 0 评论 -
从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数相乘可能溢出 数组越界……二、异常 (一)、异常语法throw 表达式;try{ //try转载 2016-10-26 09:28:40 · 540 阅读 · 0 评论 -
从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明
一、异常与继承 如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面#include <iostream>#include <string>using namespace std;class MyException{public: MyException(const char *message) : messag转载 2016-10-26 09:35:02 · 455 阅读 · 0 评论 -
从零开始学C++之标准库类型(一):string 类简介和例程
一、标准库string类型 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看template < class CharType, class Traits=char_traits<CharType>, class Allocator=allocator<CharType> >class basi转载 2016-10-25 20:19:35 · 447 阅读 · 0 评论 -
从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete
一、类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();#ifndef _INTEGER_H_#define _INTEGER_H_class Integer{public: Integer(int n); ~Integer(); Integer &operator++(); //friend转载 2016-10-25 19:58:31 · 371 阅读 · 0 评论 -
从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
一、引用 (1)、引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名; 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 注意:定义引用时一定要初始化,指明该引用是谁的别名 在实际应用中,引用一般用作参数传递与返回值 引用不是变量,引用仅仅只是变量的别名,引用没有自己独立的空间,引用要与它所引用的变量共享空间,对引用所做的改变转载 2016-10-25 14:59:04 · 492 阅读 · 0 评论 -
从零开始学C++之类与对象:类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
一、类声明 //类是一种用户自定义类型,声明形式:class 类名称{ public: 公有成员(外部接口) private: 私有成员 protected: 保护成员};在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 在关键字private后面声明转载 2016-10-25 15:18:27 · 525 阅读 · 0 评论 -
从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字
一、构造函数、默认构造函数 (1)、构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构造函数的类型(返回类型),也不能使用void 通常情况下构造函数应声明为公有函数,一般被隐式地调用。 构造函数被声明为私有有特殊的用途,比如单例模式,以后详谈。 构造函数可以有任意类型转载 2016-10-25 16:15:01 · 392 阅读 · 0 评论 -
从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数
一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化#include <iostream>using namespace std;class Object{public: Object(int num) : num_(num) { cout << "Object "转载 2016-10-25 16:38:57 · 630 阅读 · 0 评论 -
从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类与空数组
一、深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: 浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针。编译器合成的默认拷贝构造函数和赋值运算符是浅拷贝的,如果只是普通成员的赋值,浅拷贝也是可转载 2016-10-25 17:59:37 · 342 阅读 · 0 评论 -
从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小
一、static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可以用类的静态成员来解决这个问题。 非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。 (1)、static成转载 2016-10-25 18:14:29 · 331 阅读 · 0 评论 -
从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结
一、四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象、静态全局对象 全局对象的构造先于main函数 已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静态局部对象 已初始化的静态局部变量存储于.data段中 未初始化的静态局部变转载 2016-10-25 18:32:05 · 459 阅读 · 0 评论 -
从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符
一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝#include <iostream>using namespace std;class Singleton{public: static Singleton *GetInstance() { if (instance_ == N转载 2016-10-25 18:42:35 · 366 阅读 · 0 评论 -
从零开始学C++之友元:友元函数和友元类
一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。 友元函数 友元类二、友元函数 友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在类中用关转载 2016-10-25 18:58:42 · 313 阅读 · 0 评论 -
从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载
一、运算符重载 运算符重载允许把标准运算符(如+、-、*、/、<、>等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式 运算符重载,本质上是函数重载 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载二、成员函数重载 成员函数原型的格式:函数类型 ope转载 2016-10-25 19:21:18 · 742 阅读 · 0 评论 -
从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载
一、++运算符重载前置++运算符重载成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &);后置++运算符重载成员函数的方式重载,原型为: 函数类型 operator++(int); 友元函数的方式重载,原型为: friend 函数类型 operator++(类类型 &, i转载 2016-10-25 19:34:19 · 309 阅读 · 0 评论 -
从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符。[]运算符重载+运算符重载+=运算符重载<<运算符重载>>运算符重载String.h:#ifndef _STRING_H_#define _STRING_H_#include <iostream>using namespace std;class String{public:转载 2016-10-25 19:51:16 · 575 阅读 · 0 评论 -
从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector
一、对象语义与值语义1、值语义是指对象的拷贝与原对象无关。拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义2、对象语义指的是面向对象意义下的对象对象拷贝是禁止的(Noncopyable) OR 一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对任何一个的转载 2016-10-26 09:53:12 · 459 阅读 · 0 评论