校招准备系列1-C++基础

本文详细探讨了C++的基础知识,包括C和C++的区别,变量声明与定义,面向对象的三大特性,如封装、继承和多态,以及函数重载、覆盖和隐藏的概念。文章还深入讲解了作用域解析操作符、extern关键字、C++与C混编、类型转换、左值与右值、内联函数、typedef、const用法、函数指针、静态成员、内存对齐、智能指针、拷贝控制、多态实现、RTTI、内存管理等方面,全面覆盖了C++初学者所需掌握的基本概念和技术要点。
摘要由CSDN通过智能技术生成

C和C++的区别?

C++是C的超集,兼容大部分C的语法的结构
C是面向过程的语言,而C++是面向对象的语言
C++支持函数重载,而C不支持函数重载
C++中有引用,而C没有
C++中的模板/泛型编程
C中没有异常处理,C++有try/catch, throw exception

变量的声明与定义

声明只是在名字表中注册了这个名字(使得名字为程序所知)
定义是为该名字的变量在内存中分配空间(创建与名字关联的实体)
变量要定义后才能使用

面向对象的三大特性

  • 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。使得代码模块化
  • 继承:可以扩展已存在的模块,它们目的都是为了:代码重用。
  • 多态:不同类型的对象调用同一接口时产生不同的行为。为了实现另一个目的:接口重用。
重载overload、覆盖(又称重写override)与隐藏

1.成员函数被“重载”的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
2.“覆盖”是指派生类重写了基类虚函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
3.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

作用域解析操作符::(scope resolution operator)

用来限定要查找的变量、函数的范围
https://www.geeksforgeeks.org/scope-resolution-operator-in-c/

extern关键字

extern是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或其他模块中使用,记住它是一个声明不是定义!
请记住, 只在头文件中做声明,真理总是这么简单。
https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
注意,不要犯重复定义的错误!

在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”?

答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern "C"是链接声明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。作为一种面向对象的语言,C++支持函数重载,而C语言则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
所以,可以用一句话概括extern “C”这个声明的真实目的:解决名字匹配问题,实现C++与C的混合编程。

#include<file.h>#include "file.h"的区别?

答:#include "file.h"会先在代码文件所在当前目录搜索该文件file.h,如果无法找到,再去环境变量INCLUDE指示的目录下找

类型转换

非bool型 -> bool型:初始值为0则结果为false,否则为true
bool型 -> 非bool型:初始值为false则为0,初始值为true则为1
浮点数 -> 整数类型:仅保留整数部分的值
整数 -> 浮点类型:小数部分记为0
其他类型 -> 无符号类型:如果没有超出无符号类型数的表示范围,则正常转换。否则,结果是初始值对无符号类型数的总数取模后的余数。例如 unsigned char(0~255),如果给它赋值-1,则会转换成255.
!!!无符号数和有符号数切勿混合运算

左值与右值

在C++11中可以取地址的、有名字的就是左值;反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)
++a得到左值,而a++得到右值。
int operator++ (int)
而++右操作符操作函数时,相当于这样,返回的依然是一个int型,所以无论++在a的左边多少个都是可以的。
const int operator++()
注意这里返回的是一个const的,const只能作为右值,而不能作为左值的。
http://www.cnblogs.com/catch/p/3500678.html
https://blog.csdn.net/hyman_yx/article/details/52044632

inline和宏定义

内联inline:只是向编译器建议该函数需要内联,但是编译器并不一定会做。
内联函数要做参数类型检查, 这是内联函数跟宏相比的优势。
内联函数是指用inline关键字修饰的简单短小的函数,它在编译阶段会在函数调用处替换成函数语句,从而减少函数调用的开销。在类内定义的函数被默认成内联函数。
内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行。
宏定义是没有类型检查的,无论对还是错都是直接替换。内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等
宏定义和内联函数使用的时候都是进行代码展开。不同的是宏定义是在预处理的时候把所有的宏名替换,内联函数则是在编译阶段把所有调用内联函数的地方把内联函数插入。
1.宏定义是在预处理阶段进行简单替换,而内联函数是在编译阶段进行替换
2.编译器会对内联函数的参数类型做安全检查或自动类型转换,而宏定义则不会;
3.内联函数在运行时可调试,而宏定义不可以
4.在类中声明同时定义的成员函数,自动转化为内联函数。
5.宏定义会出现二义性,而内联函数不会
6.内联函数可以访问类的成员变量,宏定义则不能

typedef

typedef是为已存在数据类型定义一个新名字。例如

typedef struct Student
{
    int a;
}stu;

Student s1;
stu s2;

const 有什么用途?

const表示XXX是不变的。const变量需要初始化,否则以后也无法修改了,就没有意义了。
const变量
const int a=10;
const与指针
先说底层const。它的意思是指针指向的内容是不能通过该指针进行修改(也就意味着指向的内容可以通过其他方式修改,

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值