C与C++的关系
- C是C++的子集
- C语言是面向过程,而C++是支持面向过程和支持面向对象
C++的新特点(与C语言相比)
类型:
- 基本算数类型:bool(布尔类型)、char(字符)、wchar_t(宽字符)、char16_t(Unicon字符)、char32_t(Ubicode字符)、short(短整型)、int(整型)、long(长整型)、long long(长整型)、float(单精度浮点数)、double(双精度浮点数)、long double(扩展精度浮点数)
- 基本类型:整型(int)、字符型(char)、单精度实型(float)、双精度实型(double)、数组类型、结构类型(struct)、联合类型(union)、枚举类型(enum)、指针类型、空类型(void)、布尔类型(bool)
初始化方法:
- 复制初始化
int x=1024;
- 直接初始化
int x (1024);
随用随定义:
在C语言当中,所有变量定义必须位于函数体的最前面
在C++中,所有的变量随用随定义
C++的输入输出方式
- cout语法形式:
//例子
cout<< x << endl;
- cin语法形式:
cin >> x;
不用关注占位符,不用关注数据类型
//例子,提示用户输入一个整数,将该整数分别以8进制,10进制,16进制打印在屏幕上
//例子:提示用户输入一个布尔值,以布尔方式将值打印在屏幕上
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(void){
int x=0;
cout << "请输入一个整数:"<< endl
cin >>x;
cout << oct <<x <<endl;
cout << dec <<x <<endl;
cout << hex <<x <<endl;
cout << "请输入一个布尔值:" << endl;
bool y=false;
cin >> y;
cout << boolalpha <<y <<endl;
system("pause");
return 0;
}
C++的命名空间(namespace)
- 命名空间:简单来说就是划片取名字
- 命名空间存在的原因:避免不同库下的变量名或者程序名一样而无法区分的问题
- 命名空间的定义:
命名空间关键字:namespace,命名空间的名字不可以说重复
#include<stlib.h>
#include<iostream>
//注意:用命名空间后面要加;
using namespace std;
//举个例子
//定义命名空间A
namespace A
{
int x=1;
void fun(){
cout << 'A' <<cout;
}
}
//定义命名空间B
namespace B
{
int x=2;
void fun(){
cout << 'B' <<endl;
}
}
//另一处需要使用A的x和B的f1()
int main(void){
cout << A::x << endl;
B::fun();
system("pause");
return 0;
}
C++语言的引用
- 引用就是指变量的别名;
- 引用必须被初始化;
- 引用类型的初始值必须是一个对象;
- 引用并非对象,它只是为一个已经存在的对象所起的另外一个名字。
//例子,基本数据类型的引用
#include<iostream>
using namespace std;
int main(void)
{
int a =3;
int &b =a; //引用必须初始化
//定义一个b,b是a的引用,从地址角度理解会理解偏
b = 10;
cout<<a<<endl;
return 0;
}
- 指针本身就是一个对象,指针无需在定义时赋初值
//方便理解c++中指针和引用
#include<iostream>
using namespace std;
int main(void){
int a =10;
int *p =&a; //设置指针p指向a的地址,定义指针时必须加*号,之后使用时p就是指针,*p表示的是p指针指向的地址里面存放的数
int *&q=p; //为指针p设置别名
*q = 20;
cout<<&a<<endl; //输出结果0018FF44
cout<<a<<endl; //输出结果是20
cout<<*p<<endl; //输出结果是20
cout<<p<<endl; //输出结果是0018FF44
cout<<*q<<endl; //输出结果是20
cout<<q<<endl; //输出结果是0018FF44
}
const关键字
- const与基本数据类型:
加const的基本数据类型意味着是一个常量 - const与指针类型:
//例子1
int x =3;
const int *p = &x;
//p = &y; 正确
//*p = 4; 错误
//例子2
int x = 3;
int *const p = &x;
//p = &y; 将是错误的
//例子3
const int x = 3;
const int *const p = &x;
//p= &y; *p=4; 都是错误的
- const与引用:
//例子
int x = 3;
const int &y = x;
//x = 10;正确
//y = 20;错误
用权限小的来接收权限大的是可以的,但是用权限大的来接收权限小的是不可以的,因为不安全。
//下例不正确
const int x = 3;
int *y = &x;
//下例正确
int x = 3;
const int *y = &x;
const和define宏定义的常量的区别在于:
const在编译的时候还会进行检查,而define宏定义的常量不再会进行检查,因此在实际使用中推荐使用const定义常量。
C++函数新特性
- 函数参数默认值
有默认参数值的参数必须在参数表的最右端
//正确例子
void fun(int i,int j=5,int k=10);
//错误例子
void fun(int i, int j=5, int k);
在函数声明的时候写默认值,而在实际定义的时候最好不加默认值,避免有些编译器不过:
//正确例子
//声明时
void fun(int i,int j=5,int k=10);
//定义时
void fun(int i,int j,int k)
{
cout<<i<<j<<k;
}
- 函数重载:
作用域是程序的一部分,C++语言中大多数作用域都以花括号分隔。
在相同作用域内,用同一函数名定义多个函数,多个函数之间参数个数和参数类型不同。 - 内联函数:
编译时将函数体代码和实参代替函数调用语句
//例子来讲解内联函数
//内联函数关键字:inline
inline int max(int a,int b,int c);
int main()
{
int i=10,j=20,k=30,m;
m = max(i,j,k);
cout<<"max="<<m<<endl;
return 0;
}
//调用之后会化解成什么样子的代码
int main()
{
int i= 10,j = 20,k = 30,m;
int a,b,c;
a=i;
b=j;
c=k;
if(b>a) a=b;
if(c>a) a=c;
m=a;
cout<<"max="<<m<<endl;
return 0;
}
不是所有函数都使用内联方式的原因:
- 内联编译是建议性的,由编译器决定(你能做的只是加了inline代表你建议计算机这个函数用内联编译来做)
- 逻辑简单,调用频繁的函数建议使用内联。(不能包含for循环、while循坏这样较为复杂的逻辑结构)
- 递归函数无法使用内联方式。
C++内存管理
内存的本质是一种资源,由操作系统来掌控,程序员能做的是向操作系统申请和归还操作资源。
申请和归还内存资源就是内存管理。
- 申请内存 new
- 释放内存 delete
- new和delete都是一种运算符
- C语言中使用malloc和free来申请和释放内存
//申请内存的注意事项:申请内存时需要判断是否成功
int *p = new int[1000];
if(NULL == p)
{
//内存分配失败
}
//释放内存的注意事项:释放内存的同时还要注意释放完后,还要将该指针置为空
delete p;
p = NULL;