输入输出流iostream
向流写入数据 v2;</p>作为条件处置惩罚
while(std::cin >> value)
其结果是检测流的状态。
True:流是有效的,即流未遇到错误,那么检测成功。
False:当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。
变量
初始化与赋值
初始化不是赋值,其寄义是创建变量是赋予其一个初始值,而赋值的寄义是值替换。
注意:- long double id = 3.1415926536;
- int a{id},b = {id}; //错误
- int c(id),d = id; //正确
复制代码 如果使用列表初始化且初始值存在丢失信息的风险,则编译器报错。
变量声明和界说的关系
声明:使得名字为步伐所知。一个文件如果想要使用别的地方界说的名字则必须写声明。
界说:负责创建与名字关联的实体。申请了储存空间,赋予初始值。
作用:
如果想要在多个文件中使用同一变量,就必须将声明和界说分离。变量的界说必须出如今且只能出如今一个文件中,而其他用到该变量的文件则对其声明,同时不能有重复界说。
声明关键字extern
- extern int i; //声明i
- int j; //定义,默认初始值
- extern double pi = 3.1416; //赋值则为定义
复制代码 使用extern和包含头文件来引用函数有什么区别?
1、extern的引用方式比包含头文件要简洁,extern的使用方法很是直接,想引用哪个函数就用extern声明哪个函数。
2、会加速步伐的编译(预处置惩罚)的过程,节省时间。在大型C步伐编译过程中,这种差异是非常显着的。
引用(reference)与指针(pointer)
引用 &
- int ival = 1024;
- int &refVal = ival;
复制代码 寄义:为对象起另外一个名字,引用范例引用另外一种范例。
解释:界说引用时,步伐把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。
性质:
1、引用必须初始化:初始值对象绑定。
2、引用初始化完成,则不能修改:已经完成绑定,无法重新绑定。
3、引用即初始化对象起一个别名,不会额外开辟空间:引用不是一个对象,没有开辟空间。
指针 *
- int ival = 1024;
- int *p = &ival; //&获取地址
- *p = 42; //*解引用
复制代码 寄义:指针存放的是某个对象的地址(32位系统通常是4字节,64位系统通常是8字节)。需要获取地址,可以使用取地址符&;需要获取对象,可以使用解引用符*
空指针(null pointer)与野指针
空指针:赋值为0大概NULL,没有指向任何对象。c++11最好使用nullptr。
野指针:指针变量指向非法的内存空间。
void*指针
特殊的指针范例,可以存放恣意的对象地址。
限制:
一般拿它和别的指针比力,作为函数输入输出,大概赋值给另一个void*指针。不能直接操作void*指针所指的对象,因为不知道是什么范例,无法确定能做哪些操作。
引用与指针区别
1、指针无需肯定初始化,可以为NULL;引用必须初始化,总会指向一个对象。
2、指针界说会开辟一个地址空间;引用不会额外开辟空间。
3、指针自己是个对象,答应赋值和拷贝,生命周期内可以指向不同对象;引用初始化完成后便绑定,无法更换绑定。
const限定符
界说一种变量,它的值无法被修改。编译器在编译的过程中把用到该变量的地方替换成对应的值。指向常量的指针(pointer to const)
内容:不能通过该指针改变对象的值。但没有规定那个对象的值不能通过其他途径改变。- const double pi = 3.14;
- const double *cptr = π
- double dval = 3.15;
- cptr = &dval; //指针常量可以指向一个非常量对象
- dval = 3.14; //cptr指向对象的值被改变了
复制代码 常量指针(const pointer)
内容:指针是对象,把*放在const关键字之前,把指针定为一个常量。必须初始化,初始化完成后,则指针不能重新指向新的对象(即存放的那个地址值无法修改)。- int errNumb = 0;
- int *const curErr = &errNumb;
复制代码 constexpr和常量表达式(c++11)
内容:
1、常量表达式是指值不会改变而且在编译过程就能得到计算结果的表达式。
2、constexpr主要用于那些值在编译时就能确定的场合。它用于强调并利用编译时常量的特性。const则只是表明上只读,运行时一样可以通过其他方式改变。
3、而constexpr函数的返回值也必须是常量而且在编译时必须可以计算出来。- constexpr int mf = 20;
- constexpr int limit = mf +1;
- constexpr int sz = size(); //size是一个constexpr函数
复制代码- constexpr int sqr1(int a){
- return a*a;
- }
- const int sqr2(int a){
- return a*a;
- }
- int main()
- {
- array<int,sqr1(10)> mylist1; //可以
- array<int,sqr2(10)> mylist2; //不可以
- return 0;
- }
复制代码 constexpr和指针
内容:constexpr仅仅对指针有效,与指针所指的对象无关。constexpr会把所界说的对象置为顶层const。- int a = 10;
- const int* p = nullptr; //p是一个指针常量,可以改指向
- constexpr int* q = nullptr; //q是一个常量指针,不可改指向
- p = &a;
- //q = &a;//错误
- *q = a;
复制代码 mutable
用来修饰属性的,表示可变,被mutable修饰的属性,可以在常函数中修改,也可以由常对象修改
处置惩罚范例
别名
- typedef int *pst;
- using Int = int; //c++11
复制代码 指针、常量和范例别名
注意:- typedef int *pst;
- const pst cstr = nullptr;//cstr是指向int的常量指针,不可修改指向
- //cstr = &a; //错误
- *cstr = 10;
- //不等于
- const int *cstr = nullptr;
复制代码 解释:这种明确是错误的。声明语句中用到pst时,其基本数据范例是指针。可是用int*重写了声明语句后,数据范例就酿成了int,*成为了声明符的一部分。如许改写的结果是,const int成了基本数据范例。前后两种声明寄义大相径庭,前者声明确一个指向int的常量指针,改写后的形式则声明确一个指向const int的指针。
auto范例(c++11)
内容:auto让编译器通过初始值来推算变量的范例。一条声明语句只有一个基本范例。- auto i = 0,*p = &a; //int
复制代码 decltype范例(c++11)
内容:偶然候渴望从表达式的范例推算出要界说的变量的范例,但是不想用其表达式的值初始化变量。而decltype的作用就是选择并返回操作数的数据范例。
注意:decltype((decl))双层括号的结果永远是引用范例。大概表达式内容是解引用操作,结果也是引用范例。- int decl = 50;
- decltype(decl) a1 = 100; //int
- decltype((decl)) a1 = decl; //int&
- decltype(*p) a1 = decl; //int&
复制代码 友元
类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问,但是,偶然候需要在类的外部访问类的私有成员,怎么办?
办理方法是使用友元函数,友元函数是一种特权函数, c++答应这个特权函数访问私有成员。
这一点从现实生活中也可以很好的明确:比如你的家,有客厅,有你的卧室,那么你的客厅是ublic的,所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以答应你的闺蜜好基友进去。步伐员可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。
连续更新中
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |