语言开发-C++基础(变量定义与函数重载)
1.历史进程
1970 肯 汤普逊 UNIX UNIX之父
1972 丹里斯 里奇 C C语言之父
1979 Bjarne Stroustrup 比扬尼 C++之父 带类的C C with class
1983 C++ c plus plus
1998 ISO C++98(*)
2003 C++03
2011 C++11(*) c/c++
2.第一个C++程序
<< 输出运算符
>> 输入运算符
cout console output 控制台输出 (see-out)
cin console input 控制台输入 (see-in)
std standard 标准 名字空间
:: 作用域运算符 "的"
endl end line 换行 \n
1.头文件
C: stdio.h
C++: iostream (stdio.h == cstdio) C++ 标准库的头文件通常不带扩展名
.h .hpp
2.输入输出
C: printf() scanf()
C++: cout << cin >>
3.命名空间 namespace
std是C++ 标准库中所有的变量、函数、对象、类型等名字所在的空间
::
4.扩展名
C: .c
C++: .cpp [.C .c++ .cxx]
5.编译器
C: gcc gnu c complier (GCC)
C++: g++(*) c++
gcc 01hello.cpp -lstdc++ -o hello2
编译器安装:
sudo apt-get install g++
3.命名空间 namespace
what
why
how
命名空间 本质就是程序员分配的一块内存空间,比如标准库给这个空间起了一个名字叫std
作用:用来避免名字冲突
使用方式:
创建名字空间
namespace 命名空间名
{
//各种名字 如 变量、函数、类型 ...
}
1.使用作用域运算(限定)符::
命名空间名::要访问的成员;
std::cout
std::cin
2.命名空间声明
using 命名空间名::要访问的成员;
using std::cout;
3.命名空间指令
using namespace 命名空间名;
using namespace std;
4.无名名字空间
在C++中,所有不属于任何命名空间的全局标识符,将被编译器放到无名名字空间中
::要访问的成员
-------------------
4. 类型、函数
(1) 结构struct、联合union、枚举enum
1.在C++中,使用结构体来定义变量时,可以省略关键字struct
因为在C++中,struct就是一个真正的自定义类型
2.在C++中,结构不仅可以包含变量,还可以有函数
把结构中的变量,称为成员变量
把结构中的函数,称为成员函数
3.在使用联合类型定义变量时,可以省略关键字union
union U
{
int a;
char c;
};
U u;
u.a = 0x12345678;
c = ?
4.在使用枚举类型定义变量时,可以省略关键字enum
类型转换:
(类型)变量 //C 风格
类型(变量) //C++ 风格
static_cast<类型>(表达式) //静态转换
优点:1.明显 2.难写
const_cast<类型>(表达式) //去除常量属性
reinterpret_cast<>() //重新解释
dynamic_cast<>() //动态转换
double d = 1.23;
int a = d; //1 int a = static_cast<int>(d);
(2) 布尔类型bool
是C++ 的基本类型之一
用于表示逻辑值 真(true) 假(false)
布尔类型只有两种值 1 和 0
常用于 条件判断和函数返回
布尔类型只占一个字节的空间
(3) 字符串类型string
C++标准库提供了一种类型专门用于表示字符串 string
strcmp
strcpy
strcat
...
string 与 const char *的转换
const char *可直接赋值给string类型的变量
string类型转成const char *需要手动转换:
str.c_str()
(4) 引用
引用是一个已存在变量的别名
格式:
类型 &引用名=变量;
例:
int a = 10;
int &ra = a; //ra 与 a就是同一个变量
注:1.引用声明时,必须初始化
2.引用不是一个真正的变量,只是一个别名,所以系统不会给引用单独分配空间
引用最主要的功能是用于函数传参!
1.可读性更好
2.效率更高
(5) 函数升级
函数重载
在相同的作用域中,允许定义名字相同但参数列表不同的函数,这种特性称为函数重载
int abs(int)
double abs(double)
short abs(short)
……
函数重载的实现原理:
由编译器换名实现,编译完成后,函数的名称会变成 函数名+参数类型
C和C++混合编程:
extern "C" 链接指示
(6)引用与函数重载
区别:
相同的作用域
函数名相同
参数列表不同
extern "C"
__cplusplus
默认/缺省参数:default argument
1.当默认值与函数重载一起出现时,要避免二义性问题,不要让计算机模糊不清
2.当函数的声明和实现分开时,形参的默认值应该写在声明处
3.当某个形参设置了默认值,它右边所有的形参数都需要设置
内联inline
inline void sum(int a,int b);
把函数体嵌入到调用点,提高执行效率,节省函数调用的开销
仅仅是给编译器的一个建议
内联函数体通常不能太复杂,一般不应该出现循环、选择结构
在C 中,在新版本的编译器里,内联声明必须写在实现处。
动态内存分配:
C: malloc() free()
C++: new delete
new 用于内存分配
delete 用于内存释放
类型 *指针变量名 = new 类型;
类型 *指针变量名 = new 类型(初值);
类型 *指针变量名 = new 类型[元素个数];
delete 指针变量名;
delete []指针变量名;
nullptr