考研结束,发现c++忘了很多,甚至想不起来怎么定义一个类,抽空重新看一遍,做一些记录
输入输出cin、cout:
cout<<"asd"<<endl;//输出
cin>>a;//从键盘输出到a,注意无需格式说明符
命名空间namespace:
使用
using std::cout;//方法一
using std::endl;
//或者
using namespace std;//方法二
//或者
std::cout<<"asd"<<std::endl;//方法三
自定义命名空间:
#include <iostream>
using namespace std;
namespace space_A {
int a = 10;
}
namespace space_B {
int a = 10;
namespace space_C {
struct Person_t
{
int id;
int age;
char name[64];
};
}
}
int main()
{
space_B::space_C::Person_t p;
p.id = 1;
cout << p.id;
}
C++对C的增强
1、变量增加了对全局变量的重定义检测
int g_val; //bss段
int g_val = 1; //data段
上述代码在c中可以运行,但是在c++中会报错
2、struct在使用时候可以不写struct关键字
#include <iostream>
using namespace std;
struct MyStruct
{
int a;
};
int main()
{
MyStruct m;
//在c中,必须加上关键字:struct MyStruct m;
//或者用typedef重命名
m.a = 1;
return 0;
}
3、所有的变量,函数都必须有类型
//在c中可以运行,但是c++中不可以
f()//f()必须加上类型int
{
return 10;
}
int main()
{
f();
return 0;
}
4、对函数参数个数严格匹配
//c中能编译通过,但是会报警告:实参太多
//c++中不能通过,报错误:实参太多
int f(int a)
{
return 10;
}
int main()
{
f(10,20,30,40);
return 0;
}
5、增加了对bool的支持
注意几点:
true对应1,flase对应0。且bool类型的变量可以被赋值整型,不管怎么赋值,都只能取0或者1。
例如:
bool a_flag=true;
a_flag = 10;//此时a_flag仍然为1,表示true
a_flag = -10;//此时a_flag仍然为1,表示true
a_flag = 0;//此时a_flag为0,表示false
6、加强三目运算符:三目运算符可以作为左值
#include <iostream>
using namespace std;
int main()
{
int a=10, b=20;
(a > b ? a : b)=50; //c中会报错,c++不报错
*(a > b ? &a : &b)=50; //c中正确写法
cout << "a:" << a << " b:" << b << endl;
return 0;
}
7、加强const
先提一下const 的用法:
int main()
{
int const a=10;
const int b=10;//这两个相同,都表示一个常量
const int *pa;//pa为 const int类型的指针(指针可以改,所指的内容不可以改)
int *const pb;//pb为 int类型的const指针(指针不可改,所指的内容可以改)
const int *const pc;//pc 为const int类型的const指针(指针不可改,所指内容也不可改)
....
}
c语言中,const弊端——可以被指针所修改,根本原因是因为,执行int const a=10;的时候,会在栈上开辟空间,既然有内存空间了,就可以用指针指向这片空间,然后进行修改。
int const a=10;
int *p = &a;
*p = 70;
int array[a];//(c中会报错,c++不会)a可修改,因此无法通过a来定义数组长度
c++中修复了这个问题,当遇到const int a时,会生成key-value对,储存在常量区里面,固定不可修改,并因此这个const a没有在栈上开辟内存空间,也就无法用指针进行修改
当遇到&a时候,编译器会临时在栈上开辟一个空间用来存放a的值,这个空间和a本身没有关系,从而使得指针无法修改a的值
8、修复枚举enum
//c语言可以这么写
enum season a = 0;
if(a==0)
{
//...
}
C语言中的弊端:当枚举个数过多时候,数字不便于区分,因此在c++中,将枚举的数字表示去除了。即枚举只能赋值为枚举
C++的拓展——引用
1、引用的定义
引用可以理解为一个变量的别名,一定要初始化
1、声明的时候必须初始化,一经声明则不可更改
2、可对引用再次引用,无限套娃
3、引用类型不分配内存
4、在定义的时候,&表示引用而不是取地址
int a=10;
int &re = a;//声明re为a的引用
re=20;
cout<<a<<endl;
2、引用的本质
首先来看这样几个概念
1、引用所占用的空间与指针一样大
2、引用在声明的时候必须初始化,这与const一致
3、引用关系在定义后就不可更改,而引用的内容可以更改,这与const * 一致
基于这两点,合理怀疑:引用本质上是一个const指针,即常指针