![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C、C++
文章平均质量分 87
liuhmmjj
对计算机编程很有兴趣
展开
-
C++中 public,protected, private 访问权限标号小结
C++中 public,protected, private 访问标号小结第一:private, public, protected 访问标号的访问范围。private:只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类原创 2015-03-28 13:29:25 · 685 阅读 · 1 评论 -
C++ this指针的用法
this指针的用处:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。每个类编原创 2015-03-23 21:18:32 · 2163 阅读 · 0 评论 -
qsort和sort函数用法区别
区别sort是qsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写 cmp 函数,只要注明 使用的库函数就可以使用,参数只有两个(如果是普通用法)头指针和尾指针; 默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数bool compare(int a,int b){ return a>b; //降序排列,如原创 2015-03-31 14:04:43 · 5565 阅读 · 2 评论 -
构造函数调用构造函数进行数据成员初始化问题(极易出错)
先看下面代码:#includeusing namespace std;class CLS{public:int m_i;CLS(int i):m_i(i){cout}CLS(){CLS(0); cout}};int main(){CLS obj;coutcoutreturn 0;}此程序以为原创 2015-02-06 11:09:11 · 1609 阅读 · 1 评论 -
关于C++中的友元函数的总结
1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有下面两种情况需要使用友元函数:(1)运算原创 2015-03-24 11:54:57 · 713 阅读 · 1 评论 -
C++ 抽象类
抽象类是为了抽象和设计的目的而建立的,处于继承层次结构的上层。具体类是能够建立对象的类。一、纯虚函数定义. 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”二、引入原因:1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。2、在很多情况下,基类本原创 2015-03-24 12:02:46 · 2650 阅读 · 3 评论 -
一个空类被编译器编译后产生了哪些默认函数
为何空类的大小不是0呢?为了确保两个不同对象的地址不同,必须如此。类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0.一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明原创 2015-04-01 09:32:54 · 1691 阅读 · 0 评论 -
C++的子类指针指向父类
1,直接用基类指针引用基类对象2,直接用派生类指针引用派生类对象3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的,但是只能引用基类成员。若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)4,用派生类指针引用基类的对象。这种引用方式会导致语法错误。派生类指针必须先强制转换为基类指针,这种方法原创 2015-04-10 15:38:13 · 3634 阅读 · 1 评论 -
assert()函数用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单b原创 2015-04-22 09:27:41 · 26991 阅读 · 1 评论 -
关于大小端和union的一道极易错的笔试题
共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。union类型是共享内存的,以size最大的结构作为自己的大小下面的程序是在小端CPU上运行的( 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中)#includeu原创 2015-01-25 11:37:03 · 920 阅读 · 0 评论 -
为什么auto_ptr智能指针不能作为STL标准容器的元素
为什么auto_ptr不可以作为STL标准容器的元素假如有这样的一段代码,是否能够运行??123456789intcosta_foo(){ vector< auto_ptrint> > v(10);原创 2015-03-14 17:00:26 · 2268 阅读 · 1 评论 -
野指针
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。 “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种: (1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随原创 2015-03-14 17:35:40 · 741 阅读 · 0 评论 -
派生类构造函数规则
派生类构造函数规则如果基类拥有构造函数但是没有默认构造函数,那么派生类的构造函数必须显示的调用基类的某个构造函数。 以B类从A类派生为例,我们总结如下:1、若B有构造函数而A没有,当创建B类的对象时,B的相应构造函数被自动调用。2、若B没有构造函数而A有,则A必须拥有默认构造函数,只有这样,当创建B类的对象时,才能自动执行A的默认构造函数。3、若B有构造函数,且A有默认构造原创 2015-01-19 16:21:12 · 2886 阅读 · 0 评论 -
break和continue区别及使用场合
break可以离开当前switch、for、while、do while的程序块,并前进至程序块后下一条语句,在switch中主要用来中断下一个case的比较。在for、while与do while中,主要用于中断目前的循环执行。continue的作用与break类似,主要用于循环,所不同的是break会结束程序块的执行,而continue只会结束其之后程序块的语句,并跳回循环程序块的开头原创 2015-03-14 12:43:10 · 1495 阅读 · 0 评论 -
打印二叉树中和为某一值的路径
#include #include #include using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; void Fin原创 2015-02-06 11:24:53 · 879 阅读 · 0 评论 -
纯虚函数与虚基类
纯虚函数1、定义纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”virtual void funtion()=0;虚函数的定义是:virtual void funtion();2、引入原因:1、为了方便使用多态特性,我们常常需要在基类中定义虚函数。2、但在很多情况下,基类本身生原创 2015-02-06 22:08:15 · 2656 阅读 · 0 评论 -
对象成员
一个类的对象作为另一个类的数据成员如果一个类A的对象作为另一个类B的数据成员,则在类B的对象创建过程中,调用其构造函数的过程中,数据成员(类A的对象)会自动调用类A的构造函数。但应注意:如果类A的构造函数为有参函数时,则在程序中必须在类B的构造函数的括号后面加一“:”和被调用的类A的构造函数,且调用类A的构造函数时的实参值必须来自类B的形参表中的形参。这种方法称为初始化表的方式调用构造函数原创 2015-03-10 18:26:58 · 1004 阅读 · 0 评论 -
浅谈C++多态性
C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。 C++多态性是通过虚函数来实现的,虚函数允许子类重新定转载 2015-03-11 21:51:17 · 702 阅读 · 0 评论 -
虚拟继承的类对象的空间大小
// 含有虚拟继承对象的空间大小.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; class A{ public: protected: private: }; class B{ public: protect原创 2015-03-12 15:18:24 · 962 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一转载 2015-03-12 22:10:35 · 634 阅读 · 0 评论 -
c++ new/delete的用法
们可以通过对比的方式来看看C++delete的作用,并对这方面的知识有一个充分的认识。· C++内存管理不同方式分析· C++迭代器基本内容讲述· C++浅拷贝具体内容讲述· C++回调函数代码示例解读·原创 2015-03-17 20:18:41 · 11856 阅读 · 0 评论 -
C++模板类
如同函数模板一样,使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型。类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。 定义类模板的一般形式是: template原创 2015-03-17 22:28:54 · 1094 阅读 · 0 评论 -
const常量的实现机制以及与宏定义区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。原创 2015-03-16 10:49:25 · 2227 阅读 · 0 评论 -
c++输出char型变量与字符串的地址
在c里面如果指针是一个基本数值型int ,foalt ,long等,如果输出里有cout 其中ptr是指针的名,则输出的值是指针的地址,如果是char * (char指针) 则输出的是char指针的值。在C++中,熟悉int和char型的变量是最基本不过的了,不过,我想,很多初学者会跟我一样,搞不懂如何输出一个char变量的地址?就举下面一个例子:原创 2015-05-05 09:44:04 · 7670 阅读 · 0 评论 -
typedef常见用法
typedef声明,简称typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。 所谓美观,意指typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于typedef关键字右边。原创 2015-06-17 09:27:42 · 1266 阅读 · 0 评论 -
c++返回函数局部对象的引用
函数千万不要返回局部对象的引用或指针 局部变量在函数里面,当函数执行结束后将释放局部变量,如果返回引用或批针这个时候引用或指针指向所指向的内存空间已经释放。指针和引用将是垂悬指针。很危险!但是如果返回的“局部变量”是堆中的内存值就可以返回了C++函数为什么要使用引用?C语言之中大量利用指针作为形参或者函数返回值,这是由于值拷贝会有很大的消耗(比如传入传出一个大原创 2015-05-25 14:58:15 · 10621 阅读 · 3 评论 -
C++11 中值得关注的几大变化(详解)
源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变化“追问为什么要引入这些变化”的一个探讨,只有知道为了什么,用在什么地方,我们才能真正学到这个知识。而以此你可以更深入地了解这些变化。所以,本文不是转载 2015-06-12 12:41:18 · 1303 阅读 · 0 评论 -
C++智能指针原理
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷原创 2015-09-03 15:08:11 · 739 阅读 · 0 评论 -
new/delete多维数组/malloc分配动态二维数组
new用法: 1.开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋 值给整型指针a. 2)int *a = new int(5)作用同上,但是同时将整数赋值为5 2.开辟数组空间 一维: int *a = new原创 2015-03-30 21:40:44 · 3967 阅读 · 0 评论 -
VS2005 vc++ 后缀文件解释
dsw, aps, clw, plg这些文件都可以删除。只保留H,C,CPP,DSP,RC,剩余文件去除只读属性,其余全部删除。然后打开DSP 有提示选 YES,就可以了。 *.dsp(DeveloperStudioProject):是VC++的工程配置文件,比如说你的工程包含哪个文件,你的编译选项是什么等等,编译的时候是按照.dsp的配置来的。 *.dsw(Developer转载 2016-03-22 09:23:54 · 789 阅读 · 0 评论 -
C语言中可变参数的用法
C语言中可变参数的用法出处:yourblog[ 2005-07-21 10:16:32 ]作者:yashiro责任编辑:moningfeng 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...); 它除转载 2016-04-14 15:53:56 · 587 阅读 · 0 评论 -
VS 和Visual Assist X快捷键
“文本操作”快捷键命令名快捷键说明编辑.折叠到定义Ctrl + M,Ctrl + O自动确定在代码中创建区域的逻辑边界(如过程),然后隐藏它们。编辑.注释选定内容Ctrl + K,Ctrl + C使用编程语言的正确注释语法将代码的当前行标记为注释。(vc2003)编辑.完转载 2016-04-11 10:08:24 · 1103 阅读 · 0 评论 -
sizeof(string)的问题(很经典)
今天看到一个代码,刚开始没有看明白,代码如下:#include#includeusing namespace std;void main(){string a="www.ok2002.com";string b=" study C++ program";a.append(b,0,sizeof(b)+2);cout<<a<<" "<<sizeof(b)<<endl;}结果显示:原创 2015-04-28 12:57:19 · 16767 阅读 · 2 评论 -
构造函数复制构造函数经典问题
#includeusing namespace std;class A{public: A(int x=0) { a=x; cout<<"A Constructor"<<endl; } A(A&t) { cout<<"A COPY"<<endl; } ~A() { cout<<"A Destructor"<<endl; } void display()原创 2015-04-27 18:30:31 · 839 阅读 · 0 评论 -
程序在内存中的分布
在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。从低地址到高地址,可分为下面几段: 预留内存地址(操作系统维护的内存地址,不可访问) 程序代码区(只读,存代码和一原创 2015-04-14 12:47:26 · 1914 阅读 · 3 评论 -
atoi函数源代码
atoi函数源代码isspace(int x){ if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r') return 1; else return 0;}isdigit(int x){ if(x='0') return 1; else return 0;}int atoi(原创 2015-03-31 10:35:05 · 12874 阅读 · 2 评论 -
复制构造函数和析构函数经典例子
#includeusing namespace std;class A{public: A() { cout<<"this is construction"<<endl; } virtual ~A() { cout<<"this is destruction"<<endl; }};A fun(){ A a; return a;}int main(){原创 2015-04-16 10:15:26 · 2150 阅读 · 0 评论 -
a++和++a可不可以作为左值
1)首先说左值和右值的定义:变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的(addressable)对于每一个变量都有两个值与其相联:1).它的数据值,存储在某个内存地址中。有时这个值也被称为对象的右值(rvalue,读做are-value).我们也可认为右值的意思是被读取的值(read value)。文字常量和变量都可被用作右值。2).它的地址值——即存储数据原创 2015-04-15 14:47:17 · 2975 阅读 · 26 评论 -
二维数组名如何作为参数传递
在用二维数组名作为参数传递时容易出现Segmention Error。这是因为不能正确为二维数组中元素寻址的问题,正确的方法如下:[cpp] view plaincopy#include #include #define N 4 void testArray(int *a, int m, in原创 2015-04-16 10:34:42 · 5271 阅读 · 2 评论 -
c++模板类学习
如同函数模板一样,使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型。类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。 定义类模板的一般形式是: template cl原创 2015-04-16 10:30:04 · 905 阅读 · 0 评论