https://www.bilibili.com/video/av18629275?p=4
C++比C多了什么
C++比C新增数据类型
- auto
- long long
- bool 布尔类型
- wchar_t 宽字符
- class 类类型
- & 引用类型
C++比C新增的关键字,C语言关键字32个。
面向对象特性
- 类:封装、继承、多态、重载、抽象
- 对象
泛型编程特性
- 模板
- 泛型
结构体
- C的结构体不允许有函数的存在,C++允许有内部成员函数,且允许该函数为虚函数。所以C的结构体是没有构造函数、析构函数、this指针等。
- C的结构体对内部成员变量的访问权限只能是public,C++允许public、protected、private三种。
- C语言的结构体是不可继承的,C++的结构体是可以从其他的结构体或类继承过来的。
typeid
typeid()
操作符的作用是获取一个表达式的类型,返回结果是const type_info&
类型。不同编译器实现的type_info class
各不相同,但C++标准保证它会实现一个name()
方法,该方法返回类型名字的c-style
字符串。
使用方法:typeid(类型或变量或表达式).name()
//返回类型名字的字符串
#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
struct User
{
string username;
string nickname;
};
int main()
{
//输出类型名称
cout << typeid(int).name() << endl;//int
cout << typeid(User).name() << endl;//struct User
//输出变量类型
char c = 'a';
cout << typeid(c).name() << endl;//char
//输出表达式类型
cout << typeid(3.14 * 2).name() << endl;//double
//输出字符串类型
cout << typeid("hello").name() << endl;//char const [6]
//输出指针类型
int *p = NULL;
cout << typeid(p).name() << endl;//int *
//输出常量类型
const char *pc = NULL;
cout << typeid(pc).name() << endl;//char const *
return 0;
}
C++新增类型
wchar_t 类型
wchar_t
类型主要用在国际化程序的实现中,unicode编码的宽字符一般以wchar_t
类型存储。
char
类型与wchar_t
类型的区别
字母L
告诉编译器该字符作为wchar_t
字符串来编译
#include
using namespace std;
int main()
{
//单字节字符
char c = 'A';
//宽字节字符
wchar_t w = L'A';
//输出大小
cout << c << " byte is " << sizeof(c) << endl;//1
wcout << w << " byte is " << sizeof(w) << endl;//2
//中文输出
wchar_t cn = L'中';
wcout.imbue(locale("chs"));//默认Locale为EN_US,需设置为ch。
wcout << cn << " byte is " << sizeof(cn) << endl;
return 0;
}
bool类型
- 布尔类型,占1个字节,0表示假,非0表示真,用于条件判断。
-
false
/true
是标准C++语言中新增的关键字,是bool
类型。
#include
using namespace std;
int main()
{
bool flag = false;
cout << "flag size is " <
long long 类型
long
占4个字节,long long
占8个字节,实现了32位机器上可扩展8字节的数据。
引用
C++引入了“引用类型”,即一个变量是另一个变量的别名。
#include
using namespace std;
int main()
{
double pi = 3.1415927;
//设置p为pi的别名
double &p = pi;//&p表示定义引用变量
//设置p的内存块值
p = 100;
cout << p << endl; //100
cout << pi << endl; //100
return 0;
}
引用变量可用作函数的形式参数,表示形参和实参实际上是同一个对象。在函数中对形参的修改,也是对实参的修改。
C语言中实现变量互换值
#include
using namespace std;
void swap(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
int main()
{
int x = 100;
int y = 200;
swap(&x, &y);
cout << x << " " << y << endl;
}
C++使用引用实现变量互换值
#include
using namespace std;
// x和y表示实参的引用
void swap(int &x, int &y)
{
int t = x; x = y; y = t;
}
int main()
{
int x = 100, y = 200;
swap(x, y);
cout << x << " " << y << endl;//200 100
}
当实参占据的内存比较大的时候,使用引用代替传值(需复制)可提高效率。若不希望因此“无意中”修改了实参,可用const
修改符。
#include
using namespace std;
// &表示实参的引用,const表示不可修改。
void init(int &x, const int &y)
{
x = 100;
}
int main()
{
int x, y;
init(x, y);
cout << x << " " << y << endl;//100 6422368
}
内联函数
对于不包含循环的简单函数,建议使用inline
关键字声明为内联函数。编译器将内联函数调用使用其代码展开,称为内联展开,避免函数调用开销,提高程序执行效率。即不将其作为函数而是直接作为表达式来使用。
//内联函数
inline double distance(double x, double y)
{
return sqrt(x*x + y*y);
}
异常处理
C++通过try-catch
处理异常情况,正常代码放在try
块,catch
中捕获try
块抛出的异常。
#include
using namespace std;
int main()
{
int value = 0;
cout << "Enter Value : ";
cin >> value;
try
{
if(value > 100){
throw 1;
}
if(value < 0){
throw 0;
}
throw value/2;
}catch(int result){
cout << "Result is " << result << endl;
}
return 0;
}
https://www.bilibili.com/video/av18629275/?p=5
默认形参
函数的形参可带默认值,必须一律在最右边。
double test(double x=0, double y=0)
{
return x-y;
}
函数重载
C++允许函数同名,只要它们的形参不一样,即个数或对象参数类型不同。调用函数时将根据实参和形参的匹配选择最佳函数,如果有多个难以区分的最佳函数,则变化一起报错。注意的是不能根据返回类型来区分同名函数。
运算符重载
模板函数
模板template
函数,厌倦了对每种类型求最小值。
#include
using namespace std;
// 可对任何能比较大小的类型使用该模板
// 让编译器自动生成一个针对该数据类型的具体函数
template
T tmin(T x, T y)
{
return x
#include
using namespace std;
template
T1 tmin(T1 x, T2 y)
{
return x
动态分配内存
C++关键字new
和delete
比C语言的malloc
、alloc
、realloc
、free
更好,可以对类对象调用初始化构造函数或销毁析构函数。
堆存储区:malloc
、alloc
、realloc
、free
#define _CRT_SECURE_NO_WARNINGS //windows
#include
#include
using namespace std;
int main()
{
double d = 3.14;
double *dp;
dp = &d;
*dp = 4.14;
cout<<"d="<
输出值
d=4.14
&d=0x61ff10
*dp=4.14
dp=0x61ff10
代码解析
double d = 3.14;
变量d
是一块存放double
类型值的内存块
double *dp;
指针变量dp
表示保存double
类型的地址变量,dp
值的类型是double *
, dp
是存放double *
类型值的内存块。
dp = &d; // 0x61ff10
取地址运算符&
用于获取变量的内存地址,将double
变量d
的内存地址(指针)保存到double*
指针变量dp
中,dp
和&d
的类型都是double *
。
*dp = 4.14;
解引用运算符*
用于获得指针变量指向的那个变量
https://www.bilibili.com/video/av18629275/?p=9