C++
文章平均质量分 87
460833359
这个作者很懒,什么都没留下…
展开
-
设计模式六大原则
1.设计模式的目的设计模式是为了更好的代码重用性,可读性,可靠性,可维护性。2.常用的六大设计模式1)单一职责原则2)里氏替换原则3)依赖倒转原则4)接口隔离原则5)迪米特法则6)开闭原则3.单一职责原则该原则是针对类来说的,即一个类应该只负责一项职责。如类T负责两个不同职责:职责P1,职责P2。当职责P1需求变更而改变T时,可能造成职责P2发生故障,所以需要将类T的粒度分解为T1,T2。示例如下:用一个类秒数动物呼吸这个场景class Animal { publ转载 2021-11-16 10:15:43 · 67 阅读 · 0 评论 -
C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员
有关const成员、static成员、const static成员的初始化:1、const成员:只能在构造函数后的初始化列表中初始化2、static成员:初始化在类外,且不加static修饰3、const static成员:类只有唯一一份拷贝,且数值不能改变。因此,可以在类中声明处初始化,也可以像static在类外初始化示例: #include using st转载 2015-09-12 19:38:54 · 5034 阅读 · 2 评论 -
C++ explicit的用法
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2015-09-12 17:06:38 · 980 阅读 · 0 评论 -
extern C的作用详解
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 这个功能十分有用处转载 2015-09-13 20:55:39 · 298 阅读 · 0 评论 -
如何动态开辟二维空间的问题,
其实就是如何动态开辟二维空间的问题, 这个问题在C++ 学习者中是每个人都会遇到的, 针对这个问题我写了一个 Demo code, 希望对你以及对大家会有一些帮助。[CODE]#include #include using namespace std;int main(){int rows = 2;int cols = 3;// create a dyn转载 2015-09-28 12:40:11 · 456 阅读 · 0 评论 -
C++ 动态开辟二维数组的的方法
动态开辟二维数组,方法1:用new在堆上开辟;方法2:用vector开辟。 一:C++ new 法#include #include using namespace std;void main(){ int row, col; int **element = NULL; cin>>row >>co转载 2015-09-28 12:37:00 · 3682 阅读 · 0 评论 -
C++虚析构函数、纯虚析构函数
虚析构函数析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个古怪的“部分析构”对象,这是一个泄漏资源。排除这个转载 2015-09-12 16:34:21 · 340 阅读 · 0 评论 -
C++学习笔记 -- 虚析构函数与纯虚析构函数
开始学C++了,所以又重拾以前学习过的相关概念…析构函数是当一个对象的生命周期结束时,会自动执行析构函数。析构函数的定义:#ifndef __A_H__#define __A_H__class A{public: A(void); A(int a, int b); ~A(void); //析构函数private:转载 2015-09-12 16:27:58 · 335 阅读 · 0 评论 -
C++:构造函数和析构函数能否为虚函数
C++:构造函数和析构函数能否为虚函数?简单回答是:构造函数不能为虚函数,而析构函数可以且常常是虚函数。(1) 构造函数不能为虚函数让我们来看看大牛C++之父 Bjarne Stroustrup 在《The C++ Programming Language》里是怎么说的:To construct an object, a constructor needs the exact ty转载 2015-09-12 15:12:59 · 1631 阅读 · 0 评论 -
C++父类,不能缺的虚析构函数
规则:如果一个类有可能被继承,那么请为它加上一个虚的析构函数,即使这个析构函数一行代码也没有。 0. 引子 为什么这样说?先看一个例子。先定义3个类: class CBase{public: long m; long n; long o; CBase() {转载 2015-09-12 16:10:12 · 607 阅读 · 0 评论 -
构造函数为什么不能是虚函数
本文的主题是构造函数不能是虚函数,首先这不需要你用脑子去记,因为当你写出来虚构造函数时,编译器是能检查出来的。本文的目的是为什么构造函数不能是虚函数。首先,先看一段错误的代码,下面的代码是通不过编译阶段的。1 class A{2 public:3 virtual A(){4 this->value = 0;5 }6 private:转载 2015-09-12 15:05:36 · 467 阅读 · 0 评论 -
C++类内存分布
书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如转载 2015-09-11 14:44:08 · 233 阅读 · 0 评论 -
C++的const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如,const char blank = ‘’;blank = ‘\n’; // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区转载 2015-09-11 22:05:02 · 365 阅读 · 0 评论 -
static变量与全局、局部变量的区别
static变量与全局、局部变量的区别全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源转载 2015-06-26 08:52:53 · 648 阅读 · 1 评论 -
浅析extern “C”的作用
浅析extern “C”的作用 关于extern “C”的作用和意思,网上资料已经有很多了(我也参考了几篇),不过我还是觉得有必要自己总结一下,毕竟“好记性不如烂笔头”嘛~~ 到C标准函数库的头文件里看看,一般会经常看见有如下宏定义(除非你从来没有查看类似printf函数在头文件中的定义,就另当别论了:-()#ifdef __cplusplusext转载 2015-09-13 20:58:27 · 390 阅读 · 0 评论 -
C++静态成员函数小结(转)
类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时转载 2015-09-14 08:47:59 · 460 阅读 · 0 评论 -
回文字符串
描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。输入第一行给出整数N(0接下来的N行,每行一个字符串,每个字符串长度不超过1000.输出每行输出所需添加的最少转载 2015-09-20 00:13:38 · 471 阅读 · 0 评论 -
C++中typename和class的区别
在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了转载 2015-10-08 08:43:17 · 414 阅读 · 0 评论 -
C++ 智能指针详解
C++ 智能指针详解 一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_p转载 2015-10-06 22:14:06 · 244 阅读 · 0 评论 -
C++中智能指针的工作原理和简单实现
智能指针:它的一种通用实现方法是采用引用计数的方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。 每次创建类的新对象时,初始化指针并将引用计数置为1; 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数; 对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象转载 2015-10-06 22:23:07 · 365 阅读 · 0 评论 -
C++基础知识:c 函数调用过程原理及函数栈帧分析
1.关于栈 首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址->地地址的路径延伸,那么就很明显了,栈有栈底和栈顶,那么栈顶的地址要比栈底低。对x86体系的CPU而言,其中 ---> 寄存器ebp(base pointer )可称为“帧指针”或“基址指针”,其实语意是相同的。 ---> 寄存器esp(stack pointer)可称为“ 栈指针”。转载 2015-10-07 10:08:39 · 3062 阅读 · 0 评论 -
最快速度找到内存泄漏
1、确认是否存在内存泄漏我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。例如: class CMyApp : public CWinApp{public: BOOL InitApplication() { int* leak = new int[10]; return TRUE; }转载 2015-10-06 22:10:40 · 229 阅读 · 0 评论 -
C++中的虚函数(类的向上转换,和向下转换)
1.C++中的封装时为了代码的模块化,继承是为了代码的重用,而多态则是为了接口的重用.2.C++中的多态是用虚函数来实现的.3.子类对象向父类指针的转换(向上转换)是安全的,隐式的,而父类对象向子类指针的转换(向下转换)是不安全的,用dynamic_cast4.普通的成员函数会根据指针的类型决定调用哪个函数,而虚函数则会每次都去查虚函数表,根据具体的类对象来决定调用哪个函数.cla转载 2015-10-05 21:04:43 · 1553 阅读 · 0 评论 -
C++中“浅拷贝”与“深拷贝”
(简单点就是:对于指针,深copy时候,相同数据指针指向不同的内存地址深度拷贝是什么? 其实就是针对指针或引用的特殊处理而已。任何面向对象的程序都要解决的问题。 一个对象A里面有一个指针指向一堆数据,你现在想把这个对象拷贝一份B,那么这个指针怎么办?如果默认的话,指针的内容被拷贝,那么拷贝后的对象B和之前的对象A中的指针指向的是同一个数据。这样就是“浅拷贝”。如果B中修改了这些数据,A转载 2015-10-03 16:18:54 · 587 阅读 · 0 评论 -
C++类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample()转载 2015-10-05 15:08:52 · 374 阅读 · 0 评论 -
C++虚函数表解析(转)
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的转载 2015-10-18 22:09:30 · 337 阅读 · 0 评论 -
free 与 delete 区别
1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间2. delete [] 用于释放 new [] 分配的空间3. delete 释放空间的时候会调用 相应对象的析构函数 顺便说一下new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存4. 调用free 之前需要检查 需要释放的指针是否为转载 2015-10-02 10:36:29 · 5383 阅读 · 0 评论 -
复制构造函数跟赋值构造函数的区别
1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下: class_name(const class_name&); 它接受一个指向类对象的常量引用作为参数。例如,String类的复制构造函数的原型如下: String(const String&); 新建一个对象转载 2015-10-01 18:54:12 · 448 阅读 · 0 评论 -
c++ 析构函数为虚函数的问题
昨天去XX公司面试,面试官问了一个关于C++类析构函数为虚函数时,如果是父类的指针用子类来new,如果发生析构时,析构函数是virtual与不是virtual有什么区别。当时答的不好,回来总结了一下,在机器上实现了一遍,终于搞明白了。记录下来,以后遇到这种情况自己一定不要犯错了一、先看第一种最简单的情况吧,教科书上教的,析构函数不是virtual,正常定义一个子类对象 class st转载 2015-09-12 15:34:50 · 592 阅读 · 0 评论 -
常量指针、指针常量、C++类型转换
一、const应用1.const关键字,他后面内容的不可修改,一般来说,其修饰的变量不可再进行赋值操作;2.常量指针int a = 3;int b = 4;const int* pt = &a;a = 5;*pt的值为5,pt只是一个指针,所以他指向的是a的内容,const限制的是*pt,所以,只是不能通过*pt修改其指向的内存内容.3.指针常量:int* cons转载 2015-09-10 22:05:43 · 5736 阅读 · 0 评论 -
static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
隐式转换(implicit conversion)short a=2000;int b;b=a;short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如下图所示。宽化转换(如char到int,int到long long,int到float,float到double,int到double等)构成隐式转换,编译器允许直接转转载 2015-09-10 22:01:33 · 315 阅读 · 0 评论 -
C++函数的返回值——返回引用类型&非引用类型
函数的返回主要分为以下几种情况:1、主函数main的返回值:允许主函数main没有返回值就可结束;可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。2、返回非引用类型:函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。在转载 2015-07-17 21:01:34 · 363 阅读 · 0 评论 -
位运算的巧妙使用
这是我的这一系列文章的第一篇,主要讲述我学习过程中积累的一些编程技巧,由于我也是一个初学者,高手莫笑。这一篇主要讲解位运算的基础知识鱼与其简单应用,我主要以C/C++语言讲述,其他语言可以类推。如果你已经对位运算基础和应用十分熟悉,那么本文并不适合你。 我相信还是有一部分人对位运算还不是很了解,我希望你在看了本博文之后能对位运算有深刻的了解,并运能够用自如,能够体会转载 2015-07-05 21:09:43 · 1671 阅读 · 0 评论 -
scanf与sscanf
名称:sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... ); 说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕转载 2015-07-11 10:48:55 · 1045 阅读 · 0 评论 -
动态链接库和静态链接库的区别
静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生转载 2015-07-03 23:40:38 · 388 阅读 · 0 评论 -
程序员必须知道的8大排序和3大查找
每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。要编写出优秀的代码同样要扎实的基础,如果排序和查转载 2015-07-01 21:36:59 · 510 阅读 · 0 评论 -
printf函数对参数的计算顺序,是从右往左的(输出是从左向右的)
例:[cpp] view plaincopy#include void main() { int i=2; printf("%d,%d,%d,%d,\n",i++,++i,i,i++); printf("%d\n",i); } 首先,应该说明的是在不同的编转载 2015-07-02 15:48:23 · 16337 阅读 · 3 评论 -
strcpy与memcpy以及strncpy
1. strcpy函数 strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。 函数原型及实现:[c-sharp] view plaincopychar* strcpy(char* strDst, const char* strSrc) {转载 2015-07-10 16:28:59 · 308 阅读 · 0 评论 -
C++虚函数和虚继承浅析
本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有不对的地方请指出。下面都是以VC2008编译器对这两种机制内部实现为例。虚函数 一下是百度百科对于虚函数的解释:定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1]语法:virtual 函数返回类型 函数名(参数表) { 函数体 }用途:实现多态性,通过指向派生类转载 2015-06-29 09:44:01 · 411 阅读 · 0 评论 -
c语言结构体指针初始化
今天来讨论一下C中的内存管理。记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面我说所有指针使用前都必须初始化,结构体中的成员指针也是一样有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗那时我不知怎么的想不出理由,虽然我还是坚信要初始化的过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针)那转载 2015-06-29 21:39:11 · 1431 阅读 · 1 评论