一.C++的初始化
1.初始化列表的解决方案
int main()
{
int a=10;
int b(10);
int c{10};
int ar[10]={1,2,3,4,5,6,7,8,9,10};
int br[10]={1,2,3,4,5,6,7,8,9,10};
}
初始化概念后直接跟{},统一进行初始化。
()的初始化与{}的初始化区别
int main()
{
int a(10);
int sum();
int num{};
return 0;
}
在这段代码运行结果中不会出现sum这个变量,但会出现num这个变量。sum会被认为是函数声明。
{}具有更强的指向性,对于程序要求会更加严格。
int main()
{
int a=12;
int b=12.23;
return 0;
}
这段代码可以编译通过,只是b的值为12.
int main()
{
int a{12};
int b{12.23};
return 0;
}
而这段代码会报错,因为{}具有更强的指向性。
2.C++的输入输出
我们知道在C语言中
#include <stdio.h>中有三个
stdin(标准输入) stdout(标准输出) stderr(标准错误)
在C++中
#include <iostream>
cin=>stdin //buffer:有缓冲区
cout=>stdout //buffer
cerr=>stderr //no buffer 没有缓冲区
clog=>stdout //buffer
还要加上using namespace std;
在C++中
cin>>a>>ch;
cout<<a<<ch<<endl;
>>为提取符,提取数据给a,ch
<<为插入符,插入数据给a,ch.
endl相当于换行
cout显示在屏幕上,cerr定向在文件中
int main()
{
char ch[5]={'a','b','c','d','e'};
printf("%s\n", ch);
return 0;
}
在数组中默认以/0做结尾,如果没有遇见/0会一直打印,直到遇见/0结束。
int main()
{
const int len =128;
char str[len]{};
cin >>str;//空格
cin.getline(str,len);
cin.getline(str,len,'#');
cout <<str <<endl;
return 0;
}
在cin与scanf中默认以空格做结束
但可以使用getline,getline默认以换行结束写入,也可以自定义,如上就定义的#作为结束标志,但并不将#输入字符串中。
3.C++中的const关键字
在C语言中const 以变量为主
int main()
{
const int n =10;
int ar[n]={1,2,3};
return 0;
}
在这段代码中,n 会报错,因为数组方括号中为整型常量值,但C中const以变量为主。
const 在C++中 以常量为主,意为只可读不可写。
int main()
{
const int a=10;
int b=0;
int *ip=(int *)&a;
*ip=100;
b=a;
printf("a=%d b=%d *ip=%d\n",a,b,*ip);
return 0;
}
运行结果如下
为何在监视器中a 的值为100 但实际输出a是10呢?
在C++编译器中,当遇到const ,a会被10直接替代,而不是从地址空间取值,100只是地址空间中的值,但a实际上具有常性,至可读不可写。
当const在*左边时修饰的是指向,这是,指针的指向是可读不可写的
当const在*右边时修饰的是指针自身,这时指针自身是可读不可写的
int main()
{
int a=10,b=20;
int *p1=&a;
*p1=100;//ok
p1=&b;//ok
const int *p2=&a;
*p2=100;//error
p2=&b;//ok
int const *p3 =&a;//与上一个情况相同
int *const p4=&a;
*p4=100;//ok
p4=&b;//error
const int *const p5=&a;
*p5=100;//error
p5=&b;//error
return 0;
4.引用(别名)
引用的定义:类型&引用变量名称=变量名称。
这就是引用变量 定义。&和类型结合起来为引用符号,不是取地址符,代表别名的意思。
int main()
{
int a=10;
int b=a;
int &ra=a;
return 0;
}
ra就是a 的别名
引用的三要素
1.没有空引用。
2.引用必须要有初值
3.引用不分等级(没有二级引用,三级引用之说)
引用的函数调用
void Swap(int *ap,int *bp)
{
if(NULL==ap||NULL==bp)
return;
int tmp=*ap;
*ap=*bp;
*bp=tmp;
}
int main()
{
int x=10,y=20;
Swap(&x,&y);
return 0;
}
使用指针时必须要在前进行断言或者用 if语句判断,避免空指针
但用引用时不用判断,因为引用自身的特性就是不能有空引用
void Swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int x=10,y=20;
Swap(x,y);
return 0;
}
但引用没有指针灵活,可以给空指针但不能给空引用。
左值与右值
能够取地址的就是左值
不能够取地址的就是右值
将亡值在这两个值中来回摇摆。
另外,由内置类型(不是自己设置的类型)都有常性。
所以c=a+b;是正确的,但a+b=c;是错误的