C++基础知识总结

C++基础知识总结

第一章

  1. 面向对象的三大特性:封装、继承、多态。
    a)封装:是将一组数据和与这组数据相关的操作集合封装在一起,形成一个能动的实体,称为对象。
    b)继承:一个子类可以从它的父类那里继承所有的数据和操作,并扩充自己的特殊数据和操作。
    c)多态:是指相同界面可以对应于不同种类的多种实现,比如刹车可以对应鼓式刹车和盘式刹车。
    多态最常见的那种实现方式:函数重载,虚函数。
    函数重载:函数名相同,函数参数和函数体不相同,调用是在编译时确定的,称为早期匹配。
    虚函数:函数名、返回类型、函数参数的类型、顺序、个数、完全相同,函数体可以完全不同,晚期匹配。

第二章

指针与数组:

int a[5] = {10, 20, 3, 5, 9};
int* p;
p = 1;
p++;
a+2;

数组名a是指针常量,不能写成a++,而p是指针变量,用p++来改变指针位置指向下一个元素。

作用域和存储类型
作用域:作用域是指标识符(变量)能被作用的程序区范围,即只有在这段程序去范围内,这个标识符才是可见。

作用域可分为三种作用域:局部,全局,文件
(1)局部作用域
在块内、函数体内声明的变量都为局部变量,它们只在局部作用域内可用。
(2)全局作用域
全局作用域的变量的作用于范围是从定义之处开始一直到文件结束。
-如果将一个全局变量声明为extern,那么可被定义为另外一个文件访问。
(3)文件作用域
当在全局变量前加上static关键字,则使该变量具有文件作用域,仅在定义它们的文件内可见。

变量存储类型: auto(自动)、extern(外部)、static(静态)、register(寄存器)。
(1)自动存储类型
指定一个局部变量为自动的,即每次执行到定义该变量的语句块时,都会在内存为该变量产生一个新拷贝,并初始化。局部变量默认为自动的。
(2)外部存储类型
指定一个全局变量为外部存储类型的,,则对另外的源文件可见,可被其他源文件访问,它为全局变量缺省的情况
(3)静态存储类型
声明为静态的,它们存放在内存全局数据区,只能被源文件可见,对其余源文件不可见。
(4)寄存器存储类型
存放在告诉寄存器中,而不是随机存储的内存中。

c++中栈和堆上建立对象的区别(new的简单知识点,待补充)
在c++中类的对象建立分为两种:一种是静态建立,如A a;另外一种是动态建立,如A* p = new A();
(1)静态建立一个类对象,是由编译器为对象在栈空间中分配内存,通过直接移动栈顶指针挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。
(2)动态建立对象,是使用new运算符将对象建立在堆空间中,在栈中只保留了指向该对象的指针。
区别:栈是由编译器自动分配释放,存放函数的值,局部变量的值,对象的引用地址等。调用完程序立即释放。堆通常保存着程序运行时动态创建的对象,c++堆中存放的对象需要由程序员分配释放。

inline内联函数:
内联函数和普通函数的区别在于:当编译器调用内联函数的语句时,不会将语句编译成函数调用的指令,而是直接将整个函数体的代码插入调用语句处,就像整个函数体在调用时被重写了一模一样。(思想就是调用函数和执行函数都需要时间,当代码少的时候,执行函数的时间相比于调用函数的时间就可以忽略不计)。有了内联函数,就能像调用一个函数那样方便地重复使用一段代码,而不用付出执行函数调用的额外开销。很显然,使用内联函数会使最终执行程序的体积增加。以时间换空间。

const:

  1. 说明符号常量。
    C语言:
#difine PI 3.14

符号PI并不是真正的符号常量,他没有类型,不占用存储空间,知识在程序中将它替换为3.14.
C++:

const float PI = 3.14;

这个常量有类型,要占用存储空间,可以用指针指向这个值,但是不能被修改。
2. 说明函数的形参。

typef_name(const int x)

参数x在函数中只能被使用,不能被修改。
3. 说明指针变量。
(1)将指针声明冠以const,使指向的对象为常量,而不是指针为常量。
注意:指向的对象不一定是常量,也可以是变量,但是指向的对象不能被修改。可以指向其他的对象,可以不被初始化。

int a = 0, b = 10
const int *pi;
pi = &a;
*pi = 10;           //错误,不能修改它指向的对象
a = 10;             //指向的可以是变量
pi = &b;            //可以指向其他的对象

(2)把指针本身而不是指向的对象声明为常量,采用运算符 *const
注意:必须初始化,可以修改它指向的对象,不能指向其他对象。

int a = 0, b = 10;
int *const pi = &a; //必须初始化
*pi = 10;           //可以修改它指向的对象
pi = &b             //错误,不能指向其他对象

(3)要使两个目标都是常量,两者都要声明为const。

int a = 0, b = 1;
const int *const pi = &a;
*pi = 10;          //错误,不能修改指向的对象
a = 10;
pi = &b;           //错误,不能指向其他对象

指针与引用的区别:
(1)指针是一个对象的地址,是对所指对象的间接引用;而引用是一个对象的别名,是对对象的直接引用。修改引用,就是对引用的对象的修改。
(2)引用是一个对象的别名,因此只能始终指向在初始化时被指定的对象,相当于指针常量;而指针可以重新被赋值,指向其他对象。
(3)指针可以不被初始化,而引用一定要初始化。

第三章 类类型

重载构造函数和拷贝构造函数

拷贝构造函数是一个构造函数,在创建一个新对象时,它将参数代表的对象逐渐拷贝到新创建的对象中。
class X{
	int x, y;
	public:
	X(int a, int b)
	{
		x = a;
		y = b;
	}
	X(X& objX)
	{
		x = objX.x;
		y = objX.y
	}
}
main()
{
	X a(1,2)      //调动构造函数
	X b(a)        //调用拷贝构造函数
	X c = b       //创建的为新对象,调用拷贝构造函数
}

静态成员
(1)静态数据成员
在一个类中,一个数据说明为static,则该数据为静态数据,static数据成员被该类的所有对象共 享。无论创建多少个该类的对象,都只有一个静态数据的存储空间。静态数据存储空间不由构造函数分配。
注意:static数据成员属于类,而不属于对象。
在main函数中可以初始化公有的static数据成员;在函数体外可以初始化私有的和公有的static数据成员。
(2)静态成员函数
成员函数也可以被说明为静态的。静态成员函数没有this指针。静态成员函数只属于一个类。
在类外调用一个公有静态成员函数方式:类名::静态共有成员函数名
在类内,直接调用静态成员函数名。

友元关系
友元函数

			外部函数不能直接访问对象的私有数据,但可以通过友元函数来实现。

注意:友元函数不是类的成员函数,是类外的函数。
没有this指针,与static成员函数类似。
若在友元函数访问非static成员时,必须明确该友元函数在哪个对象上操作。

友元类
一个类Y可以是另外一个类X的友元类,则Y的所有成员函数都可以成为X的友元函数。

对象数组

X a[10];

C++不允许初始化对象数组,所以对构造函数有要求:
(1)没有构造函数;
(2)有构造函数,但要有一个构造函数不带参数;
(3)有构造函数,但要有一个构造函数参数全是缺省的。

第五章 派生类

		在创建一个派生类对象时,先要调用基类的构造函数,以便分配基类的公有段成员存储空间;
		由于调用了构造函数,一个派生类里面包括一个基类对象,只是不能(直接)访问基类的私有成员。

例子:

class base
{
	public:
	int a, b;
};
class derived: public base
{
	public b, c;
};
void main()
{
	dervide d;
	d.a = 1;
	d.base::b = 2;      //指向是base的数据成员b
	d.b = 3;
	d.c = 4;  
	base* bp = &d;      //指向基类对象的指针变量是可以指向派生类的对象,因为派生类对象中包含基类对象
	bp->c = 10;         //错误,创建的是一个基类对象,只能访问base中的数据成员
	bp->b = 20;
	bp->a = 30;
}
		private:       //私有段成员在类外不能被访问(除非友元函数),不能被继承
		protect:   //保护段成员在类外不能被访问(除非友元函数),能被继承
		public:    //公有段成员在类外不被访问,能被继承

共有派生:public,表示基类的公有段成员在派生类中仍为公有段成员,保护段成员仍为保护段成员。
私有派生:private,表示基类的公有段成员和保护段成员在派生类中都变为私有成员。

先执行基类的构造函数,再执行派生类的构造函数。
析构时时先执行派生类的析构函数再执行基类的析构函数。

						派生类的构造函数的执行顺序:基类,对象成员,派生类。

虚基类构造函数的调用顺序:

  1. 虚基类的构造函数在非虚基类的构造函数前调用;
  2. 同一层次包括多个虚基类,则按次序调用;
  3. 虚基类由非虚基类派生,先调用基类构造函数,在调用派生类构造函数

虚函数与多态性
1.指向基类对象的指针指向派生类对象
注意:指向基类对象的指针可以指向派生类对象,相反却不成立;
指向派生类对象的指针只能访问基类的公有成员,如果要访问派生内的特定成员,则需要使用显 式转换。
2.虚函数

				虚函数就是基类里面被冠以virtual的成员函数,它提供了一种接口界面。

具有虚特性的条件是:

  • 在基类中,该函数被声明为虚(virtual)函数;
  • 定义基类的共有派生类;
  • 在基类的公有派生类中一模一样地重载该函数;
  • 定义指向基类对象的指针,指向基类的公有派生类对象。

其底部主要实现原理是依靠虚函数表和虚函数指针

  1. 首先会为虚函数分配一个内存,并将其地址保存起来,虚函数依次存放。
  2. 生成派生类时,派生类首先会拷贝基类的虚函数表,如果在派生类中有对基类虚函数的重载,那么会将重载的函数在虚函数表中覆盖原来的虚函数,如果有新增的虚函数,则在虚函数表中一次添加虚函数。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值