C++学习知识点

1. OOP面向对象程序设计的多态的理解

答:多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 C++中,实现多态有以下方法:虚函数,抽象类,重载,覆盖,模板。

2.类的特征

答:封装、继承和多态。

3. C++与C#的区别

(1)C++中类的申明时,不能给数据成员赋值,通常使用构造函数来完成。而C#可以。还有C++种成员函数可以定义在类外,而C#的则不行,C#是完全面向对象的编程语言。 (2)C++支持多重继承,即子类可以有多个父类,而C#不支持多重继承,可用接口来实现,但C++中没有接口类型。 (3)C++中类的申明方式不分公有和私有,继承的时候分公有,私有和保护的方式继承。而C#刚好相反。 (4)C++中的纯虚函数在C#中叫虚构函数。 (5)C++中有指针类型,而C#中没有指针类型,C#中的delegate类型本质上就是C++中的函数指针,通俗来说就是类型化了函数指针,用于函数的回调。

4. 内联函数

答:作用:提高程序运行时调用函数的效率。 用法:用关键字inline修饰,而内联函数在调用时,是将调用表达式用内联函数体来替换,类似于宏定义。当这个函数在类的内部定义时,就可以不用inline关键字了。如: inline int add_int (int x, int y, int z) { return x+y+z; }

5.C++中数据类型分类

分为两大类 基本数据类型:char(字符), int(整数), float(单精度), double(双精度),void;C++扩充: bool(布尔),wchar_t(宽字符); 非基本数据类型: 复合数据类型:数组、指针、枚举、C++扩充:引用 构造数据类型:类、结构体、共用体。

6.初始化列表

C++中,构造函数与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。

class foo
{
public:
foo(string s, int i):name(s), id(i){} ; // 初始化列表
private:
string name ;int id ;
};

此外,C++中结构体struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。

struct foo
{
    string name ;
    int id ;
    foo(string s, int i):name(s), id(i){} ; // 初始化列表
};

为什么使用初始化列表: 主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,使用初始化列表少了一次调用成员的默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。

6. 为什么函数形参多是const修饰的引用

使用引用是防止值传递,值传递之前会将实参在堆栈产生一份拷贝,而引用则不会,因此引用传递会改变实参的值。

使用const修饰的引用表示常引用,即引用的变量是常变量,这样一来,是防止在函数中对常引用的修改,多用于修饰类的常对象。如果将值调用的形参声明为常量,则没有多大的使用价值。

7.C++编程规范

(1)尽量将类的数据成员声明为私有的,因为如果声明为public和protected,都会使类的封装性遭到破坏。 (2)将类的成员函数放到类外定义。 (3)尽量将基类的析构函数定义为虚函数,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。析构子类对象时候,基类部分也会被析构!

8. 多态的理解

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。C++中的接口就是类的成员虚函数。实现多态性,通过指向派生类的基类指针,访问派生类中同名重定义的成员虚函数。

9. 编译器对虚函数的处理过程

C++中类的数据成员是独立的,每申明一次类的对象,就会为成员数据分配内存空间,所以成员数据变量存储在对象的空间中,成员函数是编译阶段确定存储空间和地址,故成员函数对于不同的对象是共享的。 编译器在编译阶段对普通函数采用静态联编的方式,即在程序编译连接阶段决定程序中 的操作调用(函数调用)与执行该操作(函数)的代码段之间的映射关系。 编译器在编译阶段对虚函数采用动态联编的方式,即为每个类的虚函数生成一个存放虚函数地址的虚函数表。类的对象申明时,在对象空间中会生成一个虚指针(vptr)指向虚函数表(vtbl),用来访问虚函数。当基类以函数参数的形式存在,调用虚函数时,在编译的时候不能静态的映射到虚函数的代码,因为此时不知道是调用基类的虚函数还是子类的虚函数,这是就需要发生动态联编。如:

class A{
public:
    virtual  void print(){ cout<<"This is A"<<endl;}
};
class B:public A{
public:
    virtual  void print(){ cout<<"This is B"<<endl;}
};
void invokePrint(const A& a)
{
a.  print();//编译器在编译时不能静态映射到A的print()还是B的print()
                   //此时就需要运行时进行动态联编
}
int main(){ //为了在以后便于区分,我这段main()代码叫做main1
    A a;
    B b;
    a.print();
    b.print();
invokePrint(b);
}

输出结果为: This is A This is B This is B

10. 为什么基类类型指针在被子类对象赋值后不能访问子类的成员函数呢?

两张图说明问题:

Fish对象占用内存空间比Animal占用的内存空间大,故Animal* A=new Fish;Animal类型的指针A只能调用基类的成员,不能调用子类的成员。

11. 对象赋给另外一个对象的引用或者指针时,如何传递的

当对象赋给另外一个对象的引用或者对象时候,将调用被赋值的拷贝构造函数。此时就存在深拷贝和浅拷贝。深拷贝存在的情况就是在类成员中有非基本数据类型的变量时,比如指针,数组或者引用。如果只是简简单单的进行浅拷贝,也就是值拷贝,会出现一个对象被析构后,另一个对象的成员变量,比如指针会指向被释放的内存空间,这就是指针悬挂问题。此时就需要手动书写拷贝构造函数,完成深拷贝。 当对象赋给另外类的指针时候,指针存放的就是对象的首地址,只不过此时系统会进行类型转换。

附:C++中出现拷贝的情况有三种: (1) 建立一个新对象,并用另一个同类的已有对象对新对象进行初始化。 (2) 当函数的参数为类的对象时,这时调用此函数时使用的是值传递,也会产生对象的复制。 (3) 函数的返回值是类的对象时,在函数调用结束时,需要将函数中的对象复制一个临时对象并传给改函数的调用处。

12. 对于类定义对象什么时候用new,什么时候不用new的认识

(1) 构造函数只适用于类成员的初始化,与分配类对象的空间无关; (2) 隐式执行默认构造函数,初始化申明在栈上的类对象,直接申明,不要使用new,如GPR gpr,其中GPR是类;。 (3) 显式执行重载的构造函数,初始化申明在栈上的类对象,直接申明,不要使用new,如GPR gpr= GPR(6),其中类GPR构造函数是GPR(int i){}; (4) new申明的是类指针,返回的存放于堆中空间的首地址,需要类指针接收,如GPR* gpr=new GPR,此时调用默认构造函数,即无参构造函数。 (5) 申明类指针并显式调用重载的构造函数,可以这样进行:GPR* gpr=new GPR(5);

13. 关于C++中运算符重载函数有多少个参数的几点认识

(1)对于非成员运算符重载函数,若运算符为单目的,则有一个参数;若运算符为双目的,则有两个参数。 (2)对于成员函数时,若运算符为单目的,则无参数;若运算符为双目的,则有一个参数, 第一个操作数应为成员函数所属类类型。

14.C++中类与结构体的区别

struct 与class本质上应该是相同的,只是默认的访问权限不同(struct默认是public,class默认是private )。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Phoenix的Android之旅

Kotlin 进阶用法: 内联函数

继上一篇文章给大家介绍完kotlin的扩展,这篇文章给大家讲讲kotlin中内联函数的用法。

1462
来自专栏运维技术迷

PHP-函数

创建函数的语法 //function创建函数的关键字 function functionName() { 要执行的代码; } 函数准则 函数的名称应该显示出他的...

3257
来自专栏有趣的django

6.python内置函数

1. abs() 获取绝对值 >>> abs(-10) 10 >>> a = -10 >>> a.__abs__() 10 2. all()   参数为可迭代对...

3556
来自专栏运维技术迷

连仕彤博客[Python笔记] locals() 函数

1533
来自专栏闪电gogogo的专栏

Python——正则表达式特殊符号及用法

由于正则表达式的内容比较多,所以单独写成一系列文章,主要内容是根据小甲鱼所讲的内容综合一下正则表达式的笔记。 贴上小甲鱼的《Python3 如何优雅地使用正则表...

21110
来自专栏码云1024

JAVA 面向对象

4496
来自专栏java一日一条

java提高篇之关键字static

在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员...

902
来自专栏java达人

JSON.stringify(), JSON.parse(), toJSON()方法使用

1 JSON.stringify() 将value(Object,Array,String,Number...)序列化为JSON字符串 即:把原来是对象的类型...

27710
来自专栏小白的技术客栈

Python运算符

今天开始讲解Python的运算符,这一节比较简单,知识点不多。 上文回顾 今天回顾一下昨天的文章主要讲了哪些知识点: Python是一门动态的强类型语言; 变量...

4848
来自专栏java初学

final和static关键字

35911

扫码关注云+社区

领取腾讯云代金券