由于进了一家敏捷开发的公司,把自己累得不像话,博客也好几个月没更新了,实在惭愧。由于C++基础非常重要,所以打算把平时重学C++的总结,抽时间上传到博客!
1.切勿乱用带符号类型和无符号类型
#include
using namespace std;
int main()
{
unsigned u = 10;
int i = -42;
cout<
2.变量声明和定义的关系
● 如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示的初始化变量,extern如果包含初始值就不再是声明,而变成了定义了;
extern int I; //声明i而非定义i
int j; //声明并定义j
extern double pi = 3.1456; //定义
● 变量能且只能被定义一次,但是可以被多次声明;
● 变量的定义必须出现在且只能出现在一个文件中,而其他文件用到该变量的文件必须对其进行声明,却绝不能重复定义
t1.h
#ifndef _t1_H
#define _t1_H
int p = 20;
#endif
t1.cpp
#include
#include "t1.h"
using namespace std;
//extern int p = 10; //不能重复定义,报错
extern int p ; //声明p已经在t1.h中定义
int main()
{
cout<
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; //正确:初始值是double型对象的地址
double *pd2 = pd; //正确:初始值是是指向double对象的指针
int *pi = pd; //错误:指针pi的类型和pd的类型不匹配
pi = &dval; //错误:试图把double型对象的地址赋值给int型指针
int i = 42;
int *p ; //p是一个int型指针
int *&r = p; //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变量时,其实等同于在不同的文件中分别定义了不同的变量。)