11 2016 档案
摘要:最近在看《Effective C++》,其中很多地方用到了智能指针。所以决定花时间了了解一下它。 一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行
阅读全文
摘要:先来看一个栗子吧。 注释掉的部分会出现错误: 2 IntelliSense: 没有与这些操作数匹配的 "<<" 运算符 操作数类型为: std::basic_ostream<char, std::char_traits<char>> << std::string c:\Users\Administr
阅读全文
摘要:一、理解深拷贝和浅拷贝: 先来看一个栗子,引出什么是浅拷贝。 s1给s2初始化时,会调用拷贝构造函数,因为没有编写,则会调用默认的拷贝构造函数,拷贝构造函数会按成员赋值,这样s2的指针会指向s1的指针指向的空间;但析构的时候,会先释放s2指向的空间,但当析构s1指向的空间时,因为s2和s1是指向相同
阅读全文
摘要:例子: 例二: 这个例子的关键是,如果没有高亮部分的 int A::a = 0; 那么编译会出错。 编译以上代码会出现“对‘A::a’未定义的引用”错误。 这是因为静态成员变量a未定义,也就是还没有分配内存,显然是不可以访问的。 静态成员属于全局变量,是所有实例化以后的对象所共享的,而成员的初始化你
阅读全文
摘要:继承基本概念 继承概念 C++中的类成员访问级别(public、private、protected) 思考:如何恰当的使用public,protected和private为成员声明访问级别? 1、需要被外界访问的成员直接设置为public 2、只能在当前类中访问的成员设置为private 3、只能在
阅读全文
摘要:VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。 下面是va_list的用法示例 : VA_LIST的用法: (1)首先在函数里
阅读全文
摘要:每一个具体的类的类型,是一个static。 定义一个模板类,不同类型的类使用的static不是同一个。 因为编译器自动帮我们写了不同的类型的类。
阅读全文
摘要:当类模板遇上友元函数的时候有些规矩与我们的常规想法不一样。 看一下下面的代码 编译居然不通过 错误 1 error LNK2019: 无法解析的外部符号 "class Complex<double> __cdecl operator+(class Complex<double> const &,cl
阅读全文
摘要:怎么证明vptr指针存在呢??用代码来说明。 虚函数表指针(VPTR)被编译器初始化的过程 vptr:一个具有虚函数类的对象所具有的隐藏的成员,指向该类的虚函数表. 父类对象的vptr指向是一直指向父类的.但子类的vptr指针最终是指向子类的, 当子类创建的时候,先调用父类构造函数,这个时候vptr
阅读全文
摘要:多态实现的实质: 一个类,如果成员函数中添加了virtual关键字,编译器会在类中生成一个虚函数表.如下图 虚函数表是一个存储类成员函数指针的数据结构,虚函数表是由编译器自动生成与维护的,虚函数表是在编译的时候产生的. virtual成员函数会被编译器放入虚函数表中 存在虚函数时,编译器会悄悄地为每
阅读全文
摘要:多态的实现效果 多态:同样的调用语句有多种不同的表现形态; 多态实现的三个条件 有继承、有virtual重写、有父类指针(引用)指向子类对象。 多态的C++实现 virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际对象类型来判断如何调用多态的理
阅读全文
摘要:为什么会出现多态??? 赋值兼容性原则遇上函数重定义的时候就出现了问题。 重定义重写重载,傻傻分不清楚是吧。补充一下: 重定义重写重载 好啦,理解了什么是重写后,下面来看看这段代码。 //面向对象新需求 //如果我传一个父类对象,执行父类的print函数 //如果我传一个子类对象,执行子类的prin
阅读全文
摘要:学习模板特化的时候,看到了一个模板偏特化。。。又是一个未知的概念,所以有开始了学习。 模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。 先看类模板: 那么下面3句依次调用类模板、全特化与偏特化: 而对于函
阅读全文
摘要:在读《effectiveC++》的时候有一节将swap()函数偏特化,基础薄弱的我根本不知道什么叫做模板偏特化,所以学习一下模板偏特化,记录一下。 C++的模板提供了对逻辑结构相同的数据对象通用行为的定义。这些模板运算对象的类型不是实际的数据类型,而是一种参数化的类型。C++中的模板分为类模板和函数
阅读全文
摘要:类型转换有c风格的,当然还有c++风格的。c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换
阅读全文
摘要:区别: memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 一、memcpy函数 Me
阅读全文
摘要:String类的简单实现: 1、在拷贝构造函数和赋值运算符重载这两个函数中有浅拷贝和深拷贝的问题 2、要对输入输出函数重载 3、赋值运算符重载有两种方式。注意在采用交换实现的时候函数的参数只能是临时变量 这里有一个函数 String& Insert(int posl, const String& s
阅读全文
摘要:今天编写一个简单的string类,结果错误百出,写出来警示一下自己,要多动手。。。。 要求: 编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造函数S
阅读全文
摘要:语法基础: //template关键字告诉c++编译器,现在我要进行泛型编程, //typename 告诉c++编译器,T为数据类型,,,请你不要乱报错。。。。。 //T为数据类型,T为数据类型参数化,而已。。。。。int char double template<typename T> void
阅读全文
摘要:C++函数模块基础知识: 一. 问题: 强类型语言要求我们为所有希望比较的类型都实现一个实例 int min( int a, int b ) { return a < b ? a : b; } double min( double a, double b ) { return a < b ? a :
阅读全文
摘要:今天看到友元函数,竟然觉得有点生疏了。故来聊聊友元函数。 为什么会出现友元函数??? 先来看一个例子引入今天的主角: 在来个例子。这次是带static成员变量的: 因为外部函数无法访问类的私有成员(无论是静态还是非静态的),只有类的成员函数才可以。 友元函数打破类的封装性,使得外部函数可以访问类的私
阅读全文
摘要:Mem系列函数通常处理内存内容,而Str通常处理字符串,这俩个家族系列函数经常会使用为了能够更好地体现出两家族函数的异同,将采用对比的形式一一列出: 一 拷贝函数 函数名称: memcpy 函数原型:void *memcpy(void *dest, const void *src,size_t n)
阅读全文
摘要:c++中的初始化与赋值区别: 先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情 况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认
阅读全文
摘要:拷贝构造是确确实实构造一个新的对象,并给新对象的私有成员赋上参数对象的私有成员的值,新构造的对象和参数对象地址是不一样的,所以如果该类中有一个私有成员是指向堆中某一块内存,如果仅仅对该私有成员进行浅拷贝,那么会出现多个指针指向堆中同一块内存,这是会出现问题,如果那块内存被释放了,就会出现其他指针指向
阅读全文
摘要:我们都知道拷贝构造函数和赋值构造函数最大的不同在于: 拷贝构造是确确实实构造一个新的对象,并给新对象的私有成员赋上参数对象的私有成员的值,新构造的对象和参数对象地址是不一样的,所以如果该类中有一个私有成员是指向堆中某一块内存,如果仅仅对该私有成员进行浅拷贝,那么会出现多个指针指向堆中同一块内存,这是
阅读全文
摘要:引用是什么? 引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别。 那什么又是变量名呢? 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间。 也可以这样理解,变量名是逻辑概念,变量是物理层面,变量含
阅读全文
摘要:基本概念 //类是把属性和方法封装。。。 //类的内部 //类的外部 //我们抽象了一个类,用类去定义对象 //类是一个数据类型,类是抽象的 //对象是一个具体的变量。。占用内存空间。 //类做函数参数的时候,类封装了属性和方法,在被调用函数里面, 不但可以使用属性,而且可以使用方法(成员函数);
阅读全文
摘要:C++有匿名对象,只在当行代码有用,离开当行代码立即析构!!! 什么是匿名对象? 匿名对象可以理解为是一个临时对象,一般系统自动生成的,如你的函数返回一个对象,这个对象在返回时会生成一个临时对象。 匿名对象的生命周期(很重要!!!) 例一: 输出: 例二: 输出: 说明: 1、在执行playStag
阅读全文
摘要:在qt中,输入类名.后面会自动出现成员函数,如果直接用的话会出错,但是在vs2013中没有这个缺陷。 上面的代码中: A().mytest()可以正确使用,是因为A()会产生一个匿名对象然后用这个匿名调用mytest().
阅读全文
摘要:什么是静态成员函数和静态成员变量??(有些地方也叫作静态函数成员和静态数据成员) 当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。 静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。 静态成员变量的用途: 静态成员变量的用途之一
阅读全文
摘要:运算符重载基础 (该文档来自于对传智博客视频的整理) 全局函数和类成员函数的区别 为什么要有运算符重载 原因: Complex是用户自定义类型。。编译器根本不知道如何进行加减。。。编译器给你提供了一种机制,让用户自己去完成,自定义类型的加减操作。。。。。这个机制就是运算符重载机制。 简单的代码如下:
阅读全文
摘要:1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数 两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存;二是在类的构造函数中动态的分配了内存,但是在析构函数中没有释放内存或者没有正确的释放内存 2. 没有正确地清除嵌套的对象指针 3.
阅读全文
摘要:C++中类的初始化操作有四个部分组成: 1.初始化列表: 所有类非静态数据成员都可以在这里初始化, 所有类静态数据成员都不能在这里初始化 2.构造函数体: 对于类非静态数据成员: const型成员不能在这里初始化 引用型成员不能在这里初始化 没有默认构造函数的成员不能在这里初始化 对于类静态数据成员
阅读全文
摘要:简单的初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构
阅读全文
摘要:在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库、Qt中或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的
阅读全文
摘要:格式: const point_type variable_name 作用: 使指针指向的值是一个常量,不能修改.而指针本身并非常量,可以改变指针指向的地方. 例如: const int* p = &a; p = p + 1 正确:p不是常量.可以修改 *p = 16; 错误:试图改变p指针所指向的
阅读全文
摘要:类的const成员函数 如果为类成员函数,他表示 (1)不能修改成员变量; (2)不能调用非const函数; (3)其他const函数可以调用它;(其他非const函数当然也可以调用它) (4)可以被const对象(或引用用指针)上调用,比如:const A a; a.f(),也可以被普通对象调用。
阅读全文