C++基础之C到C++
C++是面向对象编程更注重大局观(架构)忽视细节是一种新的编程方式适合大型软件项目。常用于系统开发,引擎开发、嵌入式开发等应用领域, 至今仍然是最受广大程序员喜爱的编程语言之一。特点:【熟悉】•在支持C的基础上,全面支持面向对象编程•编程领域广泛,功能强大(最强大的编程语言,没有之一)•标准保持更新,目前常用的基础标准为ISO C++98标准、ISO C++11标准等•为数不多的支持底层操作的面向
一、简介
C++是面向对象编程,更注重大局观(架构),忽视细节,是一种新的编程方式,适合大型软件项目。常用于系统开发,引擎开发、嵌入式开发等应用领域, 至今仍然是最受广大程序员喜爱的编程语言之一。特点:【熟悉】•在支持C的基础上,全面支持面向对象编程•编程领域广泛,功能强大(最强大的编程语言,没有之一)
•标准保持更新,目前常用的基础标准为ISO C++98标准、ISO C++11标准等
•为数不多的支持底层操作的面向对象语言
•在面向对象的语言中执行效率极高
面向对象:【重点】
面向对象编程(OOP)OOP是程序设计工程化的一种方法,软件架构的一种思想。
OOP基本原则是程序是由单个能够起到子程序作用的单元或对象组合而成,以达到软件工程的三个主要目标:重用性、灵活性和扩展性。
面向过程 VS 面向对象:【重点】
面向过程:以“怎么解决问题为核心”
面向对象:以“谁来解决问题为核心”
面向过程,更加注重底层算法,因此语言的执行效率比较高,然而效率高的方式更偏向于计算机的思维,因此对编程者而言相对不那么友好,因此开发效率低。
面向对象,更加注重于上层的结构设计,对象和对象之间的关系构成,在执行效率上没有面向过程的要求高,思维更偏向于人的思维,因此对编程者比较友好。例:把大象装进冰箱
面向过程:
1. (我)先把门打开
2. (我)把大象装进去
3. (我)再把门关上
面向对象:
1. 先把大象和把冰箱叫过来
2. 安排任务
3. 大象和冰箱自己完成装配
C++是兼顾面向过程和面向对象,以面向对象为主的语言。
二、C++基础语法
头文件
C++内置头文件使用 <>且无.h
若是非官方头文件,使用 ""且带.h
1、引用 reference
1.1基本使用
引用是简化的指针,相当于变量或常量的别名,操作引用与操作原变量相同。操作通常与栈内存对象结合使用

1.2 性质
(1)可以改变引用的值,但是不能再次成为其他变量的引用。
(2)声明引用时,必须初始化
(3)初始化的值不能为空(NULL本身就是0,若真的想起别名,得用const int &b=NULL)
(4)声明引用时若初始化的值是纯数值,需使用const修饰引用,表示常量引用,此时数值 不可再变化![]()
const修饰的常引用不能改变引用的值,但是引用的原变量可以改变。
(5)引用的指针:可以把引用的地址交给指针保存,此时指针指向的还是引用的原变量。
指针的引用:指针也可以有别名![]()
【面试】引用与指针的区别1.引用必须初始化,指针不必.
2.引用初始化后不能被改变,指针可以改变所指的变量.
3.不存在指向空值的引用,但是存在指向空值的指针.
例:实现两数交换
//使用指针 void swap1(int *a,int *b){ int c; c=*a; *a=*b; *b=c; } //使用引用 void swap2(int &a,int &b){ int c; c=a; a=b; b=c; } int main() { int a=1; int b=2; swap1(&a,&b); swap2(a,b); return 0; }
2、初始化
// C语言初始化
int a=1;
int b=a;
// C++初始化
int c(1);
int d(c);
// C++11初始化
int e{1};
int f{e};
{}初始化的方式也被称为通用统一初始化(一致性初始化),
这是C++11的新语法,多了一个窄化(精度丢失)警告功能
3、输入
注意:在连续使用cin和getline时,要记得在cin结束后执行一下cin.ignore()来回收cin残留的换行符,否则getline无法正常执行
4、字符串类型 string
string本身不是C++的基本数据类型,因此在使用前需要引入头文件 #include <string>
注意:#include <iostream>中包含的有#include <string>
string类型用于在大多数情况下代替char * ,不需要去担心内存是否够长等问题,且string内部集成了大量操作函数
(1) 取单个字符
(建议使用at())
string str="hello";
cout<<str[0]<<endl;//效率更高
cout<<str.at(0)<<endl;//更安全
发生越界等错误情况时:
[ ]的运行结果未知
at()函数会直接报错并终止运行,因此at函数更安全
(2)求字符串长度
/* 以下二者相同
str.size()
str.length()
*/
cout<<str.size()<<endl;
cout<<str.length()<<endl;
(3) 遍历字符串
string str="hello";
//1.for循环
for(int i=0;i<str.size();i++)
{
cout<<str[i]<<" ";
}
//2.增强型for
for(char i:str)
{
cout<<i<<" ";
}
//3.迭代器
5、函数
5.1 内联函数 inline
C++中引入内联函数的目的是为了取代C语言中宏定义函数。内联函数关键字inline要放在函数定义的前面(不是函数声明),inline可以建议编译器进行主函数展开编译,如果生效,则可以提升程序的运行效率,因此消除了函数调用的额外开销。一般把长度较小(5行以内)、频繁使用且不包含复杂的控制语句的函数写为内联函数。后续学习的成员函数默认使用inline修饰但不一定是内联函数。
5.2 函数重载 overload
函数签名:函数名称、参数个数及其类型

除了上面的普通函数可以重载以外,后续学习的构造函数也能重载,但是析构函数不能重载。
5.3 参数默认(缺省)值
C++允许给函数的参数设定默认值,调用时如果传入参数,则使用传入的参数;如果不传入参数,则使用默认值。
- 如果函数的声明与定义分离,默认值可以写在声明或定义处,但是只能出现一次。
- 如果函数的某个参数被设置了默认值,其右边(后面)所有的参数都必须设定默认值。(向右原则)
- 尽量不要把参数默认值与函数重载一起使用,因为新手很容易错乱。
void print1(int a=1,int b=2,int c=3)
{
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
}
void print2(int a,int b,int c=3) //此时,在调用print2时,a、b必须传参,但c可传可不传
{
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
}
//void print3(int a,int b=2,int c) //错误!!向右原则!!
//{
// cout<<a<<" "<<b<<" "<<c<<" "<<endl;
//}
int main()
{
print1();
print2(1,2);
// print3(1,,3);
5.4 哑元函数
哑元函数在特定的场景下会发挥作用
● 可以使用这个参数强行重载函数
● 保持函数的向前兼容特性(当写好的某个子函数经过迭代后,某个参数失效,他又在主函数中被调用了很多次,为了简化更新的工作量,可以将那个参数变为哑元)
更多推荐













所有评论(0)