c++知识点框架

1

1.类的定义

  class 类名称

{

   public:

外部接口

protected:

      保护型成员

private:

      私有成员

} ;

2.类和结构体的区别

   

比较内容

结构

构造函数

支持(不能自定义,默认提供,作用是将所有的数据成员置零)

支持(能自定义)

析构函数

不支持

支持

变量初始化

不支持(private int num = 50 是错误的)

支持

继承

不支持(sealed类型)

支持

接口

可以实现多个接口

可以实现多个接口

特性

支持

支持

属性

支持

支持

方法

支持

支持

类型

值类型

引用类型

3.函数重载,封装概念

  两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这为函数的重载。

  封装概念:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成“类”,其中的数据和函数都是类的成员。

4.this指针

this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数给函数。

5.public、protected的区别

  public:为公有类型成员定义了类的外部接口。

  protected:保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中产生的新类影响不同。

6.类的作用范围

类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分。每一个类都具有该类的类域,该类的成员局部于该类所属的类域中。

7.inline的原理,inline和宏区别

 宏不可以访问私有成员,并且容易出现二义性,

 inline相对比宏更加实用。

详见 http://blog.csdn.net/lw370481/article/details/7311668

8.面向过程,面向对象区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

2

构造函数

1.类和对象的区别

类:指通过对现实世界的对象进行数据抽象和功能(行为)抽象,得到类的数据成员和函数成员。

对象:指定义一个类后,便可以定义该类的变量,这个变量就称为类的对象,这个定义的过程也称为类的实例化。

2.冒号语法、构造函数的执行流程(冒号语法需要性,对象初始化和赋初值)

冒号语法:指在构造函数中,小括号之后花括号之前,使用冒号对私有成员变量赋初值,在实际程序中必不可少。

构造函数的执行流程:先执行冒号语法中赋值,在执行函数体,根据参数不同调用相应的构造函数

3.对象的内存布局

详见http://blog.csdn.net/ljianhui/article/details/45903939

4.析构函数的执行流程

 析构函数是在对象的生存期即将结束的时刻被自动调用的函数

5.函数参数的默认值(缺省构造函数的注意点)

 在相同的作用域内,不允许在同一个函数的多个声明中对同一个参数的默认值重复定义,即使前后定义的值相同也不行。函数的定义也属于声明,如果一个函数在定义之前又有原型声明,默认形参值需要在原型声明中给出,定义中不能再出现默认形参值。

3


拷贝构造函数

1.堆内存的存在意义,C++的内存布局

堆区:指由程序员自己分配释放的空间

详见http://blog.sina.com.cn/s/blog_69e6c0030102w7yi.html

堆,栈区,静态存储器的区别

c++的内存布局:

分为5种不同的数段

c++的内存布局:

分为5种不同的数:段代码段,数据段,BBS段,堆(heap),栈


2.malloc、free和new、delete的区别

 malloc和free 的作用仅仅是开辟和释放空间

而new和delete在开辟空间同时,调用了构造函数析构函数

3.拷贝构造函数

在用对象赋值时,产生新对象 调用对应的构造函数函数实现。

4.深浅拷贝的使用及区别

浅拷贝:

 

深拷贝:


 

5.理解临时对象的产生原理

临时对象是为了满足对象内部私有成员的传递而产生的对象。

4

静态成员
友元

1.静态成员变量(声明及初始化地方)

关键词 static  为了解决同一个类的不同对象之间数据和函数共享问题,声明在成员前加上static,初始化最好习惯在声明的时候

2.静态成员函数和this指针的关系

 静态成员函数和静态数据成员的性质相似,它们都是独立于对象而属于类的。静态成员函数不属于对象,所以它没有this指针,没有了this指针那么静态成员函数也就无法访问类的非静态数据成员

3.静态成员的使用环境

类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的,而静态数据成员具有静态生存期。

4.总结C和C++语言中static用法

定义成静态变量后,使用时的值为上次的值。

作用:隐藏,保持变量内容持久,可以默认初始化为0

5.友元的局限性

(1)友元关系不能被继承 。

(2)友元关系是单向的,不具有交换性。若类B是类A的友元,类A则不是B的友元,要看在类中是否有相应的声明。

(3)友元同事不具有传递性。

5

继承和多态

1.继承使用的前提条件

两个类存在一的关系

2.派生类对象的内存布局

  一.单一继承

(1)派生类完全拥有基类的内存布局

(2)虚指针只存在一个

二.多重继承

VS的内存布局是按照声明顺序排列内存

三.虚拟继承

(1)虚继承是是为了防止“diamond”继承所带来的问题。

(2)虚继承与普通继承的区别

普通继承使得派生类每继承一个基类便拥有一份基类的成员。而虚拟继承会把通过虚拟继承的那一部分,放在对象的最后。从而使得只拥有一份基类中的成员。虚拟对象的偏移量被保存在Derived类的vtbl的this指向的上一个slot。通俗来说就是,如有有相同的,就继承一份。

(3)虚拟继承的内存布局:每个派生类会把其他不变部分放在前面,共享部分放在后面

3.派生类的构造流程

(1)按照继承顺序执行virtual基类的构造

(2)按照顺序执行非virtual类构造

(3)执行自己的构造

4.继承和组合的区别

 组合是在一类类中引用另一个类。生成另一个类的实例。   
  而继承只是继承了父类的变量和方法。   
  区别:   
  使用组合可以用到另一个类中私有的变量和方法,而继承就不可以用到父类的私有的变量和方法了他们都有各自的好处,要灵活的运用。

5.多态(必备条件)

(1)两个以上的类必须是父子关系

(2)基类和子类中必须要有同名同参函数,基类中的函数必须是虚,子类可以继承虚(故子类可以定义成非虚)

(3)必须是基类的指针或引用指向基类或子类对象。

6.虚表的工作原理

虚表的内容是依据类中的虚函数声明次序--填入函数指针。派生类别会继承基础类别的虚表(以及所有其他可以继承的成员),当我们在派生类中改写虚函数时,虚表就受了影响;表中的元素所指的函数地址将不再是基类的函数地址,而是派生类的函数地址。

7. 纯虚函数和抽象类

纯虚函数:

定义:class <类名>

{ virtual <类型><函数名>(<参数表>)=0;};

抽象类:包含纯虚函数的类。注意抽象类不能定义对象,但是可以定义抽象类的指针或引用,主要作用是为了派生子类。

8.多重继承,虚继承

9.private继承的意义

 

6

算符重载

1.运算符重载的注意事项

1c++中三目运算符“?:”,sizeof,类关系运算符“.”,

  成员指针“.*”,作用域分辨符“::”不能重载。

2 重载之后的运算符的优先级和结合性不会改变。

3 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,重载功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少有一个操作对象是自定义类型。

2.值返回与引用返回的区别

通常的返回机制将返回值复制到临时存储区域中, 随后调用程序将访问该区域. 返回引用则程序则调用程序将直接访问返回值.通常引用将指向传递给函数的引用, 因此调用函数实际上是直接访问自己的一个变量.

3.赋值运算符的深浅拷贝问题

  注意:如果当前这个类需要写析构函数去释放资源,则需要写拷贝构造函数去深拷贝资源,若要写析构函数,则说明堆上空间需要释放,如果有对象的拷贝,则新对象的空间也需要申请和旧对象一样的空间大小

4.实现string类构造、析构、拷贝构造、operator=、和operator+函数

例:

#include

using namespace std;

#include

class mystring

{

public:

mystring(char *str = "")

{

Str = new char[strlen(str)+1];

strcpy(Str,str);

}

~mystring()

{

delete []Str;

}

mystring(mystring &s)

{

   Str=new char[strlen(s.Str)+1];

   strcpy(Str,s.Str);

}

mystring operator+(mystring &s)

{

char *p=new char[strlen(s.Str)+strlen(this->Str)+1];

strcpy(p,Str);

strcat(p,s.Str);

mystring t(p);

free(p);

p=NULL;

return t;

}

mystring operator=(mystring &s)

{

Str=new char[strlen(s.Str)+1];

strcpy(Str,s.Str);

return Str;

}

void show()

{

cout<<Str<<endl;

}

friend ostream& operator<<(ostream &out,mystring &a);

private:

char *Str;

};

ostream& operator<<(ostream &out,mystring &a)

{

out<<a.Str;

return out;

}

void main()

{

mystring a("123");

a.show();

mystring b="456";

b.show();

mystring c;

(a+b).show();

c = a+b;

c.show();

cout<<c<<endl;

}


7

模板和STL

1.函数模板和类模板的形式

2.理解模板为程序编写带来的便利

3.掌握vector、list、string等常用容器

4.会使用迭代器

5.掌握STL中常用的排序及查找算法(find_if,find,sort,search

copy,reverse, merge, for_each)

猜你喜欢

转载自blog.csdn.net/zzb2019/article/details/77494148