乐趣区

关于c++:初学小白程序员看过来C面向对象编程知识总归纳

一、比照面向过程具备形象、封装、继承和多态的特:

  1. 封装是将形象失去的数据和行为相结合,造成了一个有机整体,使得一部分成员充当类与内部的接口,而将其余成员暗藏了起来达到了对成员拜访权限的正当管制,使得不同类之间的影响最小,增强数据安全,简化编程。
  2. 继承容许在放弃原有类个性的根底上,进行更具体、更具体的阐明,可能很好反映出非凡概念和个别概念之间的关系,是代码复用的根底机制。
  3. 多态使得一段程序可能具备解决多种类型对象的能力,雷同的音讯在不同的对象下会有不同的动作,加强了编程的灵活性。

二、应用 const 定义常量与用应用 define 定义常量相比,有什么长处?

a. const 常量有数据类型,而宏常量没有数据类型。编译器能够对 const 常量进行类型安全检查,而对宏常量只能字符替换

b. 有些集成化的调试工具能对 const 常量进行调试,对宏常量不能调试

c.const 定义的常量在程序运行的过程中只有一份拷贝,而 define 定义的常量在内存中有若干拷贝。

三、用代码阐明在规范 C ++ 中如何进行输入输出,并解释各语句的含意是什么?

cout<<"hello!"<<"world";
cin>>a>>b;

在输出时,从键盘输入的数据先放在键盘缓冲区中,当按回车键时,键盘缓冲区中的数据输出到程序中的输出缓冲区,造成 cin 流,而后用流提取运算符“>>”从输出缓冲区中提取数据送给程序中的无关变量。

当用 cout 和流插入运算符“<<”向显示器输入数据时,先将这些数据送到程序中的输入缓冲区保留,直到缓冲区满了或遇到 endl,就将缓冲区中的全副数据送到显示器显示进去。

四、论述 C++中函数三种调用的形式实现机制、特点及其实参、形参的格局,最好用代码阐明。(提醒:传址、传值、援用传递)

在 C ++ 中调用函数时有三种参数传递形式:

(1)传值调用;

int main( )
{void swap(int,int);          // 函数申明
    int i=3,j=5;
    swap(i,j); // 调用函数 swap
    return 0;
} void swap(int a,int b)     // 希图通过形参 a 和 b 的值调换,实现实参 i 和 j 的值调换
{ int temp;
    temp=a;        // 以下 3 行用来实现 a 和 b 的值调换
    a=b;
    b=temp;
}

(2)传址调用(传指针);

用指针类型作为形参的值调用形式,能够通过参数返回批改后的值。

void main( )
{void swap(int *,int *); int i=3,j=5;
    swap(&i,&j);                          // 实参是变量的地址
} void swap(int *p1,int *p2)          // 形参是指针变量
{ int temp;
    temp=*p1;                // 以下 3 行用来实现 i 和 j 的值调换
    *p1=*p2; *p2=temp;
}

如果感觉看完文章有所播种的话,能够关注我一下哦
知乎:逆向程序员
b 站:View 程序员
每天都会更新咱们的公开课录播以及编程干货和大厂面经
也能够间接点击 C /C++ linux 服务器开发高级架构师
来课堂上跟咱们讲师面对面交换
须要大厂面经跟学习纲要的小伙伴能够加群 1070240985 获取

(3)援用传递;

按援用传递,援用实参的援用参数传递给函数,而不是进行参数拷贝。援用类型的形参加相应的实参占用雷同的内存空间,扭转援用类型形参的值,相应实参的值也会随着变动。

int main( )
{void swap(int &,int &); int i=3,j=5;
    swap(i,j); return 0;
} void swap(int &a,int &b)     // 形参是援用类型
{ int temp;
    temp=a;
    a=b;
    b=temp;
}

五、什么是类的前向申明?应用类的前向申明时,要留神什么?

遇到俩个类互相援用的循环依赖状况

class B; // 前向援用申明
class A// A 类的定义
{ public:// 内部接口

    void f(B b);// 以 B 类对象 b 为形参的成员函数
 }; class B// B 类的定义
{ public:// 内部接口
    void g(A a);// 以 A 类对象 a 为形参的成员函数
};

前向援用申明,是在援用未定义的类之前,申明该类,使编译器晓得那是一个类名。这样,当程序中应用这个类名时,编译器就不会认为是谬误,而类的残缺定义能够在程序的其余中央。

留神:只管应用了前向援用申明,然而在提供一个残缺的类申明之前,不能定义该类的对象,也不能在成员函数中应用该类的对象。只能用于定义指针、援用、以及用于函数形参的指针和援用。当你应用前向援用申明时,你只能应用被申明的符号,而不能波及类的任何细节。

六、什么是内联函数?为什么要应用内联函数?

在编译时将所调用函数的代码间接嵌入到主调函数中,而不是将流程转出去,这种嵌入到主调函数中的函数成为内联函数。为了节俭参数传递、管制转换等开销,比方:压栈、弹栈、保留现场与复原现场。
操作符 new 的作用是什么?如何申请单个空间?如何申请动静数组?用 new 创立一个类的对象时,会产生哪些操作?必要时,请用代码阐明。
作用:在堆中申请一段空间,动静分配内存

申请单个空间 int *i = new int;

申请动静数组 int *a = new int[10];

new 创立类对象须要指针接管,一处初始化,多处应用,作用域是全局,且须要手动开释空间,在堆中动静分配内存,调用构造函数。

七、操作符 delete 的作用是什么?如何删除单个用 new 申请的空间?如何删除申请的动静数组?用 delete 删除一个类的对象时,会产生哪些操作?必要时,请用代码阐明。

作用:开释所申请的空间

开释单个空间 delete i;

开释动静数组 delete []a;

开释在堆中调配的内存,调用析构函数。

八、什么是对象?什么是类?类与对象的关系是什么?

类是逻辑上相干的函数与数据的封装,它是对问题的形象形容。

对象是类的某一特定实体。

将整个公司的雇员看成一个类,那么每一个雇员就是该类的一个特定实体,也就是一个对象。

类对象的关系:类是对象的形象,而对象是类的具体实例。类是形象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包含在特定类型的对象中的办法和变量的软件模板。

九、类中的成员能够用 public/protected/private 别离进行润饰,这三种成员在什么状况下是能够被拜访的?类中没有用 public/protected/private 润饰的成员,其可拜访性是什么,构造体中没有用 public/protected/private 润饰的成员,其可拜访性是什么?

public 润饰的成员能够在任何中央被拜访

private 润饰的成员只能由该类中的函数、其友元函数拜访;不能被任何其余拜访,该类对象也不能拜访。

protected 润饰的成员能够被该类中函数、子类函数、友元函数拜访;但不能被该类对象拜访。

public 能够被拜访,没有润饰,类的默认为 private,struct 默认为 public。

十、什么是封装?其作用是什么?(google)

封装就是将形象失去的数据和行为(或性能)相结合,造成一个有机的整体,也就是将数据与操作数据的函数代码进行有机联合,造成类。

作用:

使一部分成员充当类与内部的接口,而将其余成员暗藏起来,这样就达到了对成员拜访权限的正当管制,使不同类之间的相互影响缩小到最低限度,进而爱护数据加强数据的安全性和简化程序编写工作。

十一、什么是构造函数?构造函数有返回值吗?构造函数如何命名?构造函数能够重载吗?什么是缺省构造函数(default constructor)?什么状况下,类中会有缺省构造函数?

构造函数次要用来在创建对象时初始化对象,即为对象成员变量赋初始值。

构造函数没有返回值。

构造函数是一个与其所在的类同名的函数。

构造函数能够重载。然而, 每个构造函数必须有不同的函数签名。

如果构造函数没有参数,或者构造函数的所有参数都有默认值,就能够称其为缺省构造函数。一个类中,只能有一个缺省构造函数。

当没有定义构造函数或者定义的构造函数没有参数时,类中会有缺省构造函数。

十二、若父类中没有缺省构造函数,则对派生类的构造函数有什么要求?

如果父类是一个无缺省参数的构造函数,那么对于派生类一旦没有构造函数,那么就不会主动的先结构父类的构造函数,这是不容许的。

派生类中肯定要有构造函数。

BaseballTeam(const string s[], int si) : Team(si)

派生类的构造函数通过初始化列表,对基类进行初始化。

十三、构造函数的作用是什么?什么时候会被调用?构造函数的执行程序是什么(父类与子类的构造函数、类本身与其数据成员的构造函数)?

构造函数次要用来在创建对象时初始化对象,即为对象成员变量赋初始值。

当类被创立时,主动调用。

执行构造函数的程序:

父类的构造函数
数据成员的初始化(成员中有类,执行该类的构造函数)
子类的构造函数

十四、什么是类作用域(Class scope)、文件作用域(file scope)、函数作用域(function scope)?

类作用域:

类是有名成员的汇合,类 X 的成员 m 具备类作用域,对成员 m 的拜访形式有如下三种:

1)如果 X 的成员函数中没有申明同名的部分作用域标识符,那么能够间接应用成员 m

2)通过表达式 x.m 或 X::m(拜访动态成员)

3)通过 ptr->m,其中 ptr 为指向 X 类的一个对象的指针

文件作用域:

在函数内部申明的变量只在以后文件范畴内(包含文件内所有定义的函数)可用

在其余文件不可用。要使变量具备文件作用域,必须在变量的申明前加 static 关键字。

当多个源文件链接成一个程序时,static 能够防止一个文件中的全局变量与其它文件中的变量同名而发生冲突。

函数作用域:

(1)指在函数定义或者复合语句中,从标识符的定义点开始到函数或者一对花括号之间的程序段。

(2)在同一个部分作用域内不能呈现雷同名字的两个局部变量(包含形参)。

(3)一个函数内的复合语句又是一个部分作用域,也就是在函数内有某个变量时,复合语句中能够有另外一个同名字的变量。

十五、为什么拷贝构造函数(copy constructor)的参数必须是按援用传递 (by reference) 而不能是按值传递(by value)?

1. 有限递归调用:

当一个对象须要以值形式传递时编译器会生成代码调用它的拷贝构造函数以生成一个复本。如果类 A 的拷贝构造函数是以值形式传递一个类 A 对象作为参数的话,当须要调用类 A 的拷贝构造函数时,须要以值形式传进一个 A 的对象作为实参;而以值形式传递须要调用类 A 的拷贝构造函数;后果就是调用类 A 的拷贝构造函数导致又一次调用类 A 的拷贝构造函数,这就是一个有限递归。

2 在某些情况下,类内成员变量须要动静开拓堆内存,如果履行位拷贝,也就是把对象里的值齐全复制给另一个对象,如 A =B。这时,如果 B 中有一个成员变量指针曾经申请了内存,那 A 中的那个成员变量也指向同一块内存。这就呈现了问题:当 B 把内存开释了(如:析构),这时 A 内的指针就是野指针了,呈现运行谬误。

十六、拷贝构造函数 (复制构造函数) 的作用是什么?什么是浅拷贝?什么是深拷贝?(google)

复制构造函数由编译器调用来实现一些基于同一类的其余对象的构件及初始化。

浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝岂但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

十七、全局对象 (Global scope objects) 的构造函数、析构函数别离是什么时候被调用的?

主动部分对象 (Automatic local objects) 的构造函数、析构函数别离是什么时候被调用的?

动态部分对象 (static local objects) 的构造函数、析构函数别离是什么时候被调用的?

a. 全局变量构造函数程序运行前被调用,在 main()函数返回后才被中对象才被销毁,析构函数在程序完结前最初被调用。

b. 主动局部变量,当程序执行到对象定义时,调用主动部分对象的构造函数。该对象的析构函数在对象来到范畴时调用(即来到定义对象的块时)。主动对象的构造函数与析构函数在每次对象进人和来到范畴时调用。

c. 动态部分对象的构造函数只在程序执行首次达到对象定义时调用一次,对应的析构函数在 main 终止或调用 exit 函数时调用。

十八、父类成员中的 public、protected、private 成员,哪些在子类中是能够拜访的?

在私有继承、公有继承、受爱护继承三种继承形式下,父类成员中的 public、protected、private 成员被继承到子类后,其可拜访性别离是什么?

派生类是否能够继承父类的构造函数和析构函数?

public 和 protected 是能够拜访的,private 不可拜访。

私有继承:public、protected、private

公有继承:private、private、private

爱护继承:protected、protected、private

派生类不能继承父类的构造函数和析构函数。

十九、多重继承会带来什么问题?在 C ++ 中是如何解决的?

问题 1:类 DC 的对象中存在多个同名成员 x,应如何应用?

问题 2:类 DC 的对象中,存在两份来自类 BC0 的成员 K,如何辨别?

解决方案:

在 BC1 类和 BC2 类继承 BC0 时,其后面加上 virtual 关键字就能够实现虚构继承,应用虚构继承后,当零碎碰到多重继承的时候就会先主动加一个 BC0 的拷贝,当再次申请一个 BC0 的拷贝时就会被疏忽,以保障继承类成员函数的唯一性。

二十、要让一个函数调用体现出多态特色,必须满足哪些条件?

a. 必须存在继承关系;

b. 子类重写父类的办法。继承关系中必须有同名的虚函数,并且它们是笼罩关系(重载不行)。

c. 存在基类的指针,通过该指针调用虚函数。

退出移动版