重学C++ (一)基础回顾
阅读原文时间:2023年07月08日阅读:1

由于C++基础非常重要,所以打算把平时重学C++的总结,抽时间上传到博客!

1.切勿乱用带符号类型和无符号类型

#include <iostream>
using namespace std;

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;unsigned u = 10;
&nbsp;&nbsp;&nbsp;&nbsp;int i = -42;

&nbsp;&nbsp;&nbsp;&nbsp;cout<<i+i<<endl; //输出-84
&nbsp;&nbsp;&nbsp;&nbsp;cout<<u+i<<endl;//如果整型int占32位,输出4294967264,即这个负数+无符号数的模

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

2.变量声明和定义的关系

● 如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示的初始化变量,extern如果包含初始值就不再是声明,而变成了定义了;

extern int I;                             //声明i而非定义i

int j;                                        //声明并定义j

extern double pi = 3.1456;    //定义

● 变量能且只能被定义一次,但是可以被多次声明;

● 变量的定义必须出现在且只能出现在一个文件中,而其他文件用到该变量的文件必须对其进行声明,却绝不能重复定义

&nbsp; &nbsp; t1.h
&nbsp; &nbsp; #ifndef _t1_H
&nbsp; &nbsp; #define _t1_H
&nbsp; &nbsp; int p = 20;
&nbsp; &nbsp; #endif

&nbsp; &nbsp; t1.cpp
&nbsp; &nbsp; #include <iostream>
&nbsp; &nbsp; #include "t1.h"
&nbsp; &nbsp; using namespace std;
&nbsp; &nbsp; //extern int p = 10;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //不能重复定义,报错&nbsp;&nbsp;
&nbsp; &nbsp; extern int p ;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //声明p已经在t1.h中定义
&nbsp; &nbsp; int main()
&nbsp; &nbsp; {
&nbsp; &nbsp; &nbsp; &nbsp; cout<<p<<endl;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //20
&nbsp; &nbsp; &nbsp; &nbsp; return 0;
&nbsp; &nbsp; }

3. 复合类型

引用,引用即别名,引用并非对象,它只是为一个已经存在的对象所起的另外一个名字,引用必须初始化。

int i = 1024,i2 = 2048;      //i和i2都是int

int &r = i, r2 = i2;             //r是一个引用,与i绑定在一起,r2是int

int &refVal1 = 10;          //错误:引用类型的初始值必须是一个对象

double dval = 3.14;

int &refVal2 = dval;          //错误:此处引用类型的初始值必须是int型对象

● 指针,与引用类似,指针也实现了对其他对象的间接访问

double dval;
double *pd = &dval;&nbsp; &nbsp; &nbsp; &nbsp; //正确:初始值是double型对象的地址
double *pd2 = pd;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //正确:初始值是是指向double对象的指针
int *pi = pd;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //错误:指针pi的类型和pd的类型不匹配
pi = &dval;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //错误:试图把double型对象的地址赋值给int型指针

int i = 42;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;
int *p ;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//p是一个int型指针
int *&r = p;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//r是一个对指针p的引用(最简单的方法就是从右向左阅读r的定义,离变量名最近的符号(此例中是&r的符号&)对变量的类型有最直接的影响,因此r是一个引用。声明符的其余部分用以确定r引用的类型是什么,此例中的符号*是说明r引用的是一个指针。最后,声明的基本数据类型部分指出r引用的是一个int指针)

不同点:1.指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。

2.指针无须在定义时赋初值,和其它内置类型一样,在块作用域内定义的指针如果没有被初始化,也将有一个不确定的值

4.const限定符

1)const 对象一旦创建后其值就不能再改变,所以const对象必须初始化

const int i = get_size();       //正确:运行时初始化

const int j = 42;                  //正确:编译时初始化

const int k ;                        //错误:k是一个未经初始化的常量

2)如果想在多个文件之间共享const 对象,必须在变量的定义之前添加extern关键字

//file_1.cc 定义 并初始化了一个常量,该常量能被其他文件访问

extern const int bufsize = fcn();

//file_1.h头文件

extern const int bufsize;     //与file_1.cc中定义的bufsize是同一个

3)默认状态下,const对象仅在文件内有效(为了支持这一用法,同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效。当多个文件中出现了同名的const变量时,其实等同于在不同的文件中分别定义了不同的变量。)