![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++基础学习
chengonghao
这个作者很懒,什么都没留下…
展开
-
函数指针
什么是函数指针?函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。 一个具体函数的名字,如果后面不跟调用符号(即括号),则该名字就是该函数的指针(注意:大部分情况下,可以这么认为,但这种说法并不很严格)。 函数指针的声明方法// 定义函数指针pfint (*pf)(const int&, const原创 2016-03-24 18:44:50 · 384 阅读 · 0 评论 -
数组指针和指针数组
数组指针和指针数组的区别数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。原创 2016-03-24 17:33:27 · 262 阅读 · 0 评论 -
四种类型转换
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,命名上理解是动态类型原创 2016-03-24 17:20:44 · 1288 阅读 · 0 评论 -
向控制台打印指针
int a = 1;int *p = &a;printf("%p",p);原创 2016-03-24 12:17:00 · 362 阅读 · 0 评论 -
销毁new的指针
delete 指针实际上释放了指针所指的堆内存,但指针本身是一个32位(在32位机器上)的无符号整数。其值是对象的首地址,这个值并没变。也就是说,你用delete后,不但指针任然存在,而且其内容都没有变换。他本身的释放在超过他生命周期的时候销毁。然而现在指针所指的内存已经不可用了,再次操作其内容将会发生内存错误(比如再次delete)。所以,安全的做法是让指针值等于NULL(如果指针是NULL,d原创 2016-03-24 12:16:26 · 1785 阅读 · 0 评论 -
虚函数和纯虚函数的区别
1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(ba原创 2016-03-24 12:15:52 · 517 阅读 · 1 评论 -
虚拟析构函数
1,基类或者父类的析构函数声明为虚函数后,他的子类的析构函数都将变成虚函数。2,无论析构函数是不是虚函数,当子类对象被撤销时,都将自动调用父类的析构函数。3,将父类或者基类声明为虚函数的目的是为了实现多态性,也就是晚绑定。例如:class base{public: base(){} ~base(){}}class child : public base{原创 2016-03-24 12:14:48 · 769 阅读 · 0 评论 -
assert()
1、assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );2、assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:#in原创 2016-04-05 11:20:24 · 376 阅读 · 0 评论 -
指针和const限定符
一、指向const对象的指针1、定义格式:const 类型 *指针名const放在类型名的前面,它是用来限定对象的类型的,即对象的类型是(const 类型)。2、由于对象是const类型,在定义的时候进行了初始化之后就不能被修改,所以通过指向const对象的指针修改对象的值是错误的。3、把一个const对象的地址赋给一个普通的、非const对象的指针也是错误的。因为指向const对原创 2016-03-22 21:47:06 · 374 阅读 · 0 评论 -
重载和重写的区别
重载( overload) 和重写 (overried ,有的书也叫做“ “ “ “ 覆盖” ” ” ” )的区别?常考的题目。从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同, 或许参数类型不同,或许两者都不同) 。重写:是指子类重新定义父类虚函数的方法。从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后原创 2016-03-22 21:46:27 · 294 阅读 · 0 评论 -
子类不能从父类继承哪些?
今天突然想起了一个问题,就是C++中,子类能否继承父类的静态成员函数和变量。在网络了解了一下,得到的结论大致是: 子类不能从父类继承的有: 1. 构造函数 2. 拷贝构造函数 3. 析构函数 子类能从父类继承的有: 1、静态成员变量 2、静态成员函数 3、友元函数原创 2016-03-22 21:44:28 · 8080 阅读 · 0 评论 -
数组
一、数组是由类型名、标示符和维数组成的复合数据类型。二、数组的定义和初始化1、数组的维数必须是大于等于1的常量表达式,包括:整数字面值常量、枚举常量、常量表达式初始化的整型const对象。2、如果数组在定义时没有提供显示初始化,则会像普通变量一样初始化:全局:在函数体外定义的内置类型数组,初始化为0;局部:在函数体内定义的内置类型数组,无初始化;类类型:数组元素为类类型时,原创 2016-03-24 18:29:23 · 306 阅读 · 0 评论 -
数据的大端小端表示法
在32位小端的机器上,如下代码输出是什么:char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08}; short *pshort = (short *)array; int *pint = (int *)array; int64 *pint64 = (int64 *)ar原创 2016-03-24 18:30:41 · 1110 阅读 · 0 评论 -
什么是类型安全的
什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿原创 2016-03-24 18:32:44 · 6267 阅读 · 0 评论 -
将类的方法声明为虚函数的作用
把成员函数声明为虚函数的主要目的是为了支持多态,比如我们有一个基类 Shape 和一个派生类 Circle ,代码如下:class Shape{public: Shape(){}; virtual ~Shape(){}; virutal void Draw();};class Circle: public Shape{ Circle(){};原创 2016-03-24 18:42:48 · 782 阅读 · 0 评论 -
拷贝构造和赋值函数
每个类只有一个赋值函数.由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:1.如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_dat原创 2016-03-24 18:42:12 · 311 阅读 · 0 评论 -
空类中默认产生的成员函数
默认产生4个类成员函数:构造函数析构函数拷贝构造函数赋值函数原创 2016-03-24 18:41:34 · 453 阅读 · 0 评论 -
类成员初始化顺序
类的初始化表的初始化顺序是根据成员变量的声明顺序来执行的,而不是按照初始化列表的顺序。#inlude #inlude using namespace std;class base{private: int m_i; int m_j;public: base(int i) : m_j(i),m_i(m_j){} base() : m_j(i),m_i(m_j)原创 2016-03-24 18:41:13 · 2049 阅读 · 0 评论 -
类的常量成员的初始化
示例:class A{ const int Size = 0;}错误:常量成员不能在类中声明的地方初始化,因为此时类并没有进行实例化(创建对象),因此并没有分配内存,不能进行初始化。类的成员的初始化:1,非static非const成员变量,必须在构造函数中进行初始化;2,static成员变量,必须在类的外面进行初始化;3,const成员变量,必须在类的原创 2016-03-24 18:40:40 · 4811 阅读 · 1 评论 -
类的公有私有保护继承
第一:private, public, protected 访问标号的访问范围。private:只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类的对象访问。public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由原创 2016-03-24 18:40:07 · 618 阅读 · 0 评论 -
类的静态成员
因为类的静态成员变量是所有实例共用的.所以得在类外初始化.调用的时候可以通过对象调用,也可以通过类直接调用class A{public: int i; //有默认值};class B{public: static int n; static A Aobj;};int B::n = 1; //静态成员变量的初始化A B::Aob原创 2016-03-24 18:38:32 · 425 阅读 · 0 评论 -
内链接和外连接
啥叫内连接 外连接我们知道编译的时候(假如编译器是VS),是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来.简单的说,如果一些变量或函数的定义是内连接的话,链接器链接的时候就不会拿它们去与obj比较看有重复定义不,一个源文件中的extern声明的变量或函数也不能使用另外一个源文件中的内连接的变量或函数.而如果是外连接的话则需要在不同的ob原创 2016-03-24 18:37:27 · 582 阅读 · 0 评论 -
全局静态变量和局部静态变量的区别
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。 (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。 (3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值原创 2016-03-24 18:35:35 · 1884 阅读 · 0 评论 -
深拷贝和浅拷贝
C++中对象的复制就如同“克隆”,用一个已有的对象快速地复制出多个完全相同的对象。一般而言,以下三种情况都会使用到对象的复制:(1)建立一个新对象,并用另一个同类的已有对象对新对象进行初始化,例如:class Rect{private: int width; int height;};Rect rect1;Rect rect2(rect1); //原创 2016-03-24 18:34:07 · 309 阅读 · 0 评论 -
C++基类和派生类的赋值
点击打开链接在C/C++中,经常会发生数据类型转换,例如整型数据可以赋值给浮点型变量,在赋值之前,先把整型数据转换为浮点型;反过来,浮点型数据也可以赋值给整型变量。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:int a = 10.9;printf("%d\n", a);输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如:float b转载 2016-04-05 09:49:24 · 5175 阅读 · 0 评论 -
C++继承时的对象模型
点击打开链接在没有继承时对象的内存模型很简单,成员变量和成员函数会分开存储:对象的内存中只包含成员变量,存储在栈区或堆区(使用 new 创建对象);成员函数与对象内存分离,存储在代码区。当存在继承关系时,内存模型会稍微复杂一些。继承时的内存模型有继承关系时,派生类的内存模型可以看成是基类成员变量和新增成员变量的总和,所有成员函数仍在另外一个区域——代码区,由转载 2016-04-05 09:20:29 · 2013 阅读 · 0 评论 -
Unicode和多字节字符集 (MBCS) 杂谈
http://blog.sina.com.cn/s/blog_72e928910100yklp.html这个估计是很多人曾经头疼过的问题,现在的VC版本基本都支持Unicode和多字节字符集 (MBCS),在进行MFC编程时VC的默认设置是unicode字符集。但是我们通常需要做一些代码移植的工作,如果将多字节字符集下的程序代码移植到unicode字符集环境中,就需要针对此做出很多类型的转转载 2016-04-04 18:28:47 · 711 阅读 · 0 评论 -
必须在初始化列表中的情况
必须用到初始化成员列表的四种情况:1) 初始化一个reference成员2) 初始化一个const成员3) 调用一个基类的构造函数,而该函数有一组参数4) 调用一个数据成员对象的构造函数,而该函数有一组参数摘自《C++对象模型》下面的例子讲的就是调用基类的构造函数,而该函数有一组参数#include using namespace std;class Bas原创 2016-04-04 18:28:16 · 465 阅读 · 0 评论 -
变量的定义和声明
1、变量的定义用于为变量分配存储空间,还可以为变量制定初值。在一个程序中,变量有且只有一次定义。2、变量的声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。当一个变量定义在其他文件中,可以用关键字extend声明变量。原创 2016-04-04 18:26:58 · 2201 阅读 · 0 评论 -
变量在内存中的存储
C++中变量在内存中的存储一、内存大致可以分为三部分:代码区、堆栈区、静态数据段。C和C++中有全局变量,静态变量以及局部变量等几类。全局变量和静态变量是在编译的时候就已经分配好在数据段,也就是说在执行main函数之前就已经分配好了地址,如果定义的时候已经初始化,那么就存放初始化的值,如果没有初始化,则由编译器初始化为0。这就说明在整个程序的执行过程中全局变量和静态变量的地址和类型不会发生原创 2016-04-04 18:26:36 · 4958 阅读 · 0 评论 -
迭代器失效
Vector1、内部数据结构:连续存储,例如数组。2、随机访问每个元素,所需要的时间为常量。3、在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。4、可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。5、迭代器失效插入:vector的迭代器在内存重新分配时将失效(它所指向的元素原创 2016-04-04 18:24:27 · 463 阅读 · 0 评论 -
逗号表达式
逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n 逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。z=(x%y,x/y) 先计算x%y =1,再计算x/y=3,然后 z=(1,3)=3原创 2016-04-04 18:23:44 · 5590 阅读 · 0 评论 -
构造函数的执行顺序
经测试按照如下顺序:一、先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须初始化后才执行其构造函数。二、任何虚拟基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)三、任何非虚拟基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)四、任何成员对象的构造函数按照它们声明的顺序构造五、类自己的构造函数原创 2016-04-04 18:10:36 · 924 阅读 · 0 评论 -
static静态成员变量和静态成员函数
转载自:http://c.biancheng.net/cpp/biancheng/view/209.html点击打开链接一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干。但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享。可以使用全局变量来达到共享数据的目的。例如在一个程序文件中有多个函数,每一个函转载 2016-04-01 10:20:11 · 627 阅读 · 0 评论 -
this指针详解
转载自:http://c.biancheng.net/cpp/biancheng/view/201.html点击打开链接this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址)。通过 this,可以访问当前对象的成员变量和成员函数。所谓当前对象,就是正在使用的对象,例如对于stu.say();,stu 就是当前对象,系统正在访问 stu 的成员函数转载 2016-04-01 09:36:43 · 708 阅读 · 0 评论 -
C++函数编译原理和成员函数的实现
转载自:http://c.biancheng.net/cpp/biancheng/view/2996.html点击打开链接从上节的例子可以看出,对象的内存模型中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 obj 的类型为 Demo,也不知道它还有一个成员函数 display()。那么,究竟是如何通过对象调用成员函数的呢?C++函数的编译C++和C语言的编译方式不同转载 2016-04-01 09:33:41 · 8526 阅读 · 0 评论 -
string用法
string属于标准库类型1、使用时须包含头文件:#include using std::string2、string对象的初始化(1)默认初始化:string str;(2)复制初始化:string s1(s2);(3)直接初始化:string s1("hello"); string s1(n,'c');3、字符串字面值与标准库原创 2016-04-04 18:29:20 · 449 阅读 · 0 评论 -
sizeof用法汇总
sizeof用法一、sizeof的概念sizeof是C语言的一种单目操作符,尤其注意的是,它不是一个函数。sizeof接收一个操作数,操作数可以是一个表达式或者是括在括号内的数据类型名。sizeof操作符以字节形式给出其操作数的栈存储大小。sizeof不是函数,也不是运算符,它是个类似宏定义的关键字,sizeof()括号内的内容不会被编译,而是被类型所替代。例如:int a原创 2016-04-04 18:30:59 · 5327 阅读 · 0 评论 -
return用法
return用于结束正在执行的函数,将控制权返回给调用函数的函数。return的两种使用方式:return;return expression;1、没有返回值的函数声明为void的函数,用return或者不用。例外,也可以用return expression,但是expression必须是void类型的函数2、main函数的返回值main函数的返回的类型必须是int类型,原创 2016-04-04 18:31:34 · 686 阅读 · 0 评论 -
C++继承权限和继承方式
C++继承的一般语法为:class 派生类名:[继承方式] 基类名{ 派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选的,如果不写,默认为 private 或 protected。1) public继承方式基类中所有public成员在派生类中为pu转载 2016-04-05 09:05:00 · 1443 阅读 · 0 评论