C++复习1
头文件
1.除了C++库外,也支持标准C库
2.C++库的头文件不加.h,
3.在C++语言中调用C语言标准头文件可以去掉.h 前面加c
输出输出
cin 标准输入流,有缓存
cout 标准输出流输出,有缓存
通过hex/oct/dec可以改变输出的进制,
改变为某进制后到下次设定前都保持次进制不变,
cin/cout(输入输出)同理
cerr 标准错误流,无缓存
PS:\n 具有刷新缓存的功能
------------------------------------------------------------------------
对象 含义 对应设备 对应的类 c语言中相应的标准文件
cin 标准输入流 键盘 istream_withassign stdin
cout 标准输出流 屏幕 ostream_withassign stdout
cerr 标准错误流 屏幕 ostream_withassign stderr
clog 标准错误流 屏幕 ostream_withassign stderr
------------------------------------------------------------------------
<< 输出定向符
>> 输入定向符
------------------------------------------------------------------------
支持C库,所以可以用printf和strlen等函数
注意加头文件<cstdio>/<cstring>
setw(整数):
只能填整数,表示空出该整数个字符的空间,从右往左推入该空间
cout << "hello" << setw(10) << "1234567890" << endl;
名字空间:
std 是标准名字空间
:: 作用域限定符
using 名字空间::类的预定义对象;
using namespace 名字空间;
变量定义和赋值:
1.变量可以在使用时定义
作用域:只在该语句块内有效
例:for(int i=0; i<10; i++){}
2.变量赋值
int n = 250;
int n(250);
string类:
1.字符串定义和赋值
string str("hello");
string str = "hello";
string str(10,'b');//相当于“bbbbbbbbbb”
string str = str1 + str2;
string str = str1 + "hello";
string str[2] = {"hello","world"};
2.求大小
str.size()
3.判空
if(str.empty() == 1)
4.使用单个字符
string str("hello");
string str[2] = {"hello","world"};
cout << str1[0] << endl;//结果为h
cout << str2[0][0] << endl;//结果为h
bool:
1.定义和赋值
bool i = true;
bool i = false;
2.bool型变量被赋的值非零即为false
3.所占大小为1个字节
sizeof(bool)
指针和引用的区别:
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;
而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
(2)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(3)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(4)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(5)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(6)指针和引用的自增(++)运算意义不一样;
const:
1.C和C++中的const对比
C 中的const修饰的变量,为只读属性,不能直接修改,可以通过指针间接修改
C++中的const修饰的变量,为只读属性,不能修改,不能通过指针修改
2.const修饰指针
const int *p //*p指向的内容不可以改
int * const p //p指向的地址不可以改
const int * const p //p指向的地址不可以改,*p指向的内容也不可以改
3.const修饰引用
“引用”被定义赋初值时(或者作为形参被传参时):
普通引用 不能赋(传)常量
const修饰的引用 既可以赋(传)变量,也可以赋(传)常量
4.const和宏对比
宏 预处理时起作用 可全局使用
const 编译时起作用 有作用域 要检查类型
函数:
1.传参:
(1)传值
(2)传址
(3)传引用
前两种为复制传参,最后一种为非复制传参(效率更高)
2.占位参数
定义:
int fun(int,int){}
使用:
fun(参数1,参数2)
调用时不可省略参数,两个都要写,不然编译报错。
3.默认参数
定义:
int fun(int i=0,int c=0){}
函数原型中,默认参是放在最后的。
参数列表中一旦定义了一个默认参,后面的都要是默认参。
使用:
fun();
fun(1);
fun(1,2);
调用时可以省略默认参数
4.返回值为引用
int& fun(void){}
可以作为左值
fun() = 100;
5.形参为引用
不用const修饰,只能传变量
用const修饰,变量常量都能传
函数重载:
函数的重载是在返回值和函数名一致的情况下参数列表的类型和个数不一样就会引起函数的重载
函数匹配(函数重载)的三步走
1)候选函数 ,函数名一样
2)选着可行函数 参数的个数和类型一样
3)寻找最佳匹配
PS:
Main函数不能重载
函数重载不关心返回值
内联函数:
1)inline 建议内联
2)__attribute__((always_inline)) 强制内联
PS:
内联函数出现的原因,解决宏函数的副作用
宏函数的副作用:
i)优先级容易产生歧义,要注意加括号
#define MUL(a,b) a*b
MUL(2,2+3);
ii)自增自减时产生的问题
#define MAX(a,b) (a>b)?a:b
MAX(++a,--b);
重载的函数也可以内联
强制类型转换:
1)支持C的转换
1.1)自动转型
char b;
int a = b;
1.2)强制类型
int b;
char a = (char)b;
2) C++中的强制类型转换
reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)
struct结构体
C++的结构体中可以写函数原型
C++定义结构体变量时,前面可以不写struct
例:
struct msg{
int a;
int (*fun1)(int i);
void fun2(){
};
};
msg a;
new和delete关键字
new 相当于malloc(字节数);
delete 相当于free(指针变量);
例:
int *i = new int(0);
delete i;
int *p = new int[10]{(0)};
delete p;
转载请注明原文地址: https://ju.6miu.com/read-22994.html