![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++语言
文章平均质量分 52
QuitePig
这个作者很懒,什么都没留下…
展开
-
新式转型操作符
① const_cast操作符允许添加或移除表达式中类型的const或volatile修饰符const Person *getEmployee(){}Person *anEmployee = const_cast(getEmployee());② static_cast它用于将一个继承层次结构中的基类的指针或引用,向下转型为一个派生类的指针或引用。原创 2012-11-05 10:36:39 · 644 阅读 · 0 评论 -
赋值和初始化不同以及安全拷贝
String 类的原型如下class String{ public: String(const char *str=NULL); //构造函数 String(const String &other); //拷贝构造函数 ~String(void); //析构函数 String& operator原创 2012-09-24 19:49:09 · 397 阅读 · 0 评论 -
C++ 中常量成员函数
class X{public:X():buffer_(0),isComputed_(false){}//...void setBuffer(){ int *tmp = new int[MAX]; delete []buffer_; buffer_=tmp;}void modifyBuffer(int index,int value) const //不原创 2012-11-08 14:26:28 · 915 阅读 · 0 评论 -
指向类成员的指针并非指针
class C{ public: //... int a_;};int C::*pimC; //一个指针,指向C的一个int成员C aC;C *pc = &aC;pimC = &C::a_;aC.*pimC = 0;int b = pc->*pimC; 将pimC的值设置为&C::a_时,实际上是将pimC设置为a_在C内的偏移量。说得更明白原创 2012-11-08 15:20:12 · 490 阅读 · 0 评论 -
指向成员函数的指针并非指针
class Shape{ public: //.... void moveTo(Point newLocation); bool validate() const; virtual bool draw() const = 0; //...};class Circle : public Shape{ //...原创 2012-11-08 15:50:59 · 543 阅读 · 0 评论 -
C++中代理类和句柄类
指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态。然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak。当我们有几个指针指向同一个对象时有其应该注意,关于何时释放这个对象:(1) 如果释放的太早,那么其它的指针仍然指向这片内存,如果再使用它会造成未定义行为。(2) 如果一直不释放可能会丢失最后一个指向这个对象的指转载 2012-11-08 15:01:13 · 732 阅读 · 0 评论 -
函数模板与类模板的区别
函数模板与类模板有什么区别?答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。 即函数模板允许隐式调用和显式调用而类模板只能显示调用 这期间有涉及到函数模板与模板函数,类模板与模板类的概念(类似于类与类对象的区别)请看下面例子 注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通转载 2013-02-28 11:26:38 · 530 阅读 · 0 评论 -
C++ 文本文件操作(非二进制)
文件操作:打开文件文件名注意路径名中的斜杠要双写,如:"D:\\MyFiles\\ReadMe.txt"文件打开方式选项:ios::in = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)ios::out = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)ios::ate = 0x04原创 2013-03-12 13:07:29 · 899 阅读 · 0 评论 -
四类需要在初始化列表中初始化的情况
1、const 修饰的类成员变量2、内嵌对象3、引用类型4、基类构造函数需要传参数原创 2013-03-13 15:59:40 · 638 阅读 · 0 评论 -
30分钟理解STL
要点STL算法作为模板函数提供。为了和其他组件相区别,在本书中STL算法以后接一对圆括弧的方式表示,例如sort()。STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,原创 2012-10-02 19:12:40 · 1180 阅读 · 0 评论 -
各种操作符的重载
#include "Complex.h"// 求平方宏#define SQUARE(__X__) ((__X__) * (__X__))// 默认构造函数CComplex::CComplex (void) : _dReal (0.f) , _dImage (0.f){ cout }// 重载的构造函数CComplex::CComplex (double原创 2013-03-13 16:25:09 · 647 阅读 · 0 评论 -
模板类声明和定义为何要写一起
前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(转载 2013-03-02 09:54:11 · 416 阅读 · 0 评论 -
结构体在内存中的对齐规则
原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。 比如此例,首先系统会将字符型变量a存入第0个字节(相对地址,指内存开辟的首地址);然后在存放整形变量b时,会以4个字节为单位进行存储,由于原创 2012-08-26 11:59:17 · 1406 阅读 · 2 评论 -
C++ 虚函数表解析
C++ 虚函数表解析前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议转载 2012-08-25 14:21:10 · 387 阅读 · 0 评论 -
常量指针与指向常量的指针以及“引用”的相关注意点
第一部分:常量指针与指向常量的指针① T * const p = new T ; //常量指针,指向非常量T②T const *p = new T ;// 非常量指针,指向常量T const T *p = new T ;// 非常量指针,指向常量T 这两种形式是等价的。③const T * const p = new T;//常量指针,指向常量T原创 2012-08-12 12:39:04 · 550 阅读 · 0 评论 -
指针比较的含义
在C++中,一个对象可以有多个有效的地址,因此,指针比较不是关于地址的问题,而是关于对象同一性的问题。class Shape{...};class Subject{...};class ObservedBlob : public Shape,public Subject{...};在这个类层次结构中,ObservedBlob同时派生于Shape和Subject,并且由于是公有派生,原创 2012-08-12 13:32:35 · 798 阅读 · 0 评论 -
c++虚函数、纯虚函数、抽象类、虚析构函数、纯虚析构函数、虚基类
一 、C++虚函数表达一种动态的性质:由基类指针或引用所表示的实际对象来选择所要执行的操作。二、C++纯虚函数实声明时“初始化”为0的虚函数。它是一个在基类中说明的虚函数,它在该基类中没有定义(即没有函数体),具体的定义由派生类去完成。纯虚函数的定义形式是:virtual 返回类型 纯虚函数名(参数列表)=0;在很多情况下,基类本身生成对象是不合情理的。例如,动原创 2012-08-11 18:21:45 · 900 阅读 · 0 评论 -
C++ 枚举类型
1、枚举enum的用途浅例 写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等。 更常见的,打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即: const int input = 1;原创 2012-11-05 12:01:49 · 511 阅读 · 0 评论 -
智能指针
现在,C++有如下智能指针,除了auto_ptr外,其他都是11标准引入的。所有的智能指针都是模板化(class template)的。so,可以使用xxxx_ptr的形式来满足不同的数据类型。① unique_ptrsmart pointer with unique object ownership semantics只能有一个主人的指针,可以用于STL容器② shared_原创 2012-08-12 14:57:15 · 485 阅读 · 0 评论 -
让接口不易被误用
让接口不易被误用注意点一:class Date{ public: Date(int month,int day,int year); ...}容易犯两个错误:Date(30,3,2012) //应该是3,30,2012Date(2,30,2012)//错误的日期原创 2012-08-12 16:54:31 · 898 阅读 · 0 评论 -
[C++]父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序
①子类静态成员变量(类外声明)②子类静态成员函数③子类实例成员变量(参数列表里初始化,而不是在构造函数体内)④父类静态成员变量⑤父类静态成员函数⑥父类实例成员变量⑦父类构造函数⑧子类构造函数规则可以总结为:子类成员变量先于父类成员变量静态成员变量先于实例变量类成员变量初始化先于类的构造函数父类构造函数先于子类构造函数原创 2012-09-24 20:00:45 · 1417 阅读 · 0 评论 -
静态成员函数作用
一、可以实现某些特殊的设计模式:如Singleton; 二、由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是那种非成员函数(孤立函数),没有this指针的。比如你可以在类的内部写一个线程函数供CreateThread创建线程用,如果没有静态函数,那么这种回调函数就必须定义成全局函数(非静态成员函数指针无法转换成全局函数指针原创 2012-09-26 23:38:53 · 1755 阅读 · 1 评论 -
堆、栈、自由存储区、全局/静态存储区和常量存储区
在C++程序中内存是分为5块的,注意区分1.代码段2.栈3.堆4.自由存储区(在C++中与5合并)5.全局/静态存储区(其中存放未初始的全局变量的段 又叫BSS段)6.文字常量存储区栈,那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管原创 2012-09-21 19:37:04 · 1351 阅读 · 0 评论 -
堆、栈和堆栈平衡
堆(heap)与栈(stack)是程序存储空间上的一组概念。应用程序启动时程序启动时,windows的PE装载器会将PE文件(可执行文件,Unix/Linux 上是ELF)的不同部分的内容装入不同的内存区域。程序的数据段包括.data段(全局变量)和.rdata段(静态变量和常量)。而PE装载器只能从程序中读出已初始化的全局变量和静态变量,并将它们放在的一段专门的初始化的数据的内存区域上。而未初始转载 2012-08-15 10:56:49 · 1288 阅读 · 0 评论 -
C++自定义拷贝(复制)构造函数的用途
语法格式为: 拷贝构造函数原型的一般形式:类名(const 类名&形参对象名){}; 构造函数的形参是本类对象的引用而不是本类的对象是为了防止引起拷贝构造函数无休止地递归调用。一、缺省拷贝构造函数。class A{}A a(3,2);A b = a ;//调用拷贝构造函数b = a//非初始化操作,为赋值操作。二 自定义拷贝构造函数原创 2012-08-12 14:20:19 · 1411 阅读 · 0 评论 -
C/C++程序内存泄漏检测
1. 包含头文件和定义:#define _CRTDBG_MAP_ALLOC#include #include 如果定义了_CRTDBG_MAP_ALLOC,打印出来的是文件名和行数等更加直观的信息。2. 方法一在程序入口写几个语句: int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); tmpFlag原创 2012-09-26 23:35:16 · 724 阅读 · 0 评论