怎么说呢,昨天晚上发了一个博客竟然要审核,有点僵。想想看了点TCP/IP果然如果得深入了解的话,还是很麻烦的。今天端午节还是从C++开始吧,说到C++从大二就开始学了,然后最近论文算法也是用到了C++来编,由于不考虑效率只求结果,所以只是了解很少关于C++的知识,里面很多的东西都忘记了。该学的还是要学啊,但学习嘛,还是要从基础的来……
学习资料《C++ Primer(第五版)》。
声明:使得名字被程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。声明一个变量,就在关键字前加extern
定义:负责创建与名字关联的实体。
不怎么好理解,通过编程尝试了下:
//B.h
int a;
void op();
----------
//C.cpp
#include<iostream>
using namespace std;
extern void op();
extern int a;
//这里如果再定义op(),程序会报错。
/*void op(){
cout << "its c";
}
*/
void test(){
cout << a << endl;
op();
}
------------
//A.cpp
#include<iostream>
#include"C.h"
using namespace std;
extern int a=1;
extern void op();
void op(){
cout << "its a" << endl;
}
void main(){
a = 2;
cout << a << endl;
op();
test();
getchar();
}
从结果上看,输出结果为:
2
its a
2
its a
可以看出,声明变量或函数后,若没有定义,需要重定义。若在多个文件中使用同一个变量,就必须将声明和定义分离。变量的定义必须出现在且只能出现在一个文件中,而其他用到改变量的文件必须对其进行声明,但绝对不能重复定义。
作用域
以上面的程序为模板修改了下A.cpp
#include<iostream>
#include"C.h"
using namespace std;
extern int a=1;
extern void op();
//此时不能再定义全局变量a了。
//int a = 2;
void op(){
cout << "its a" << endl;
}
void main(){
int a = 3;
cout << a << endl;
op();
test();
}
此时输出:
3
its a
1
its a
从上面可以看出,内层作用域强度大于外层作用域,若在外面对声明变量进行了定义,似乎就不能重新定义全局变量。
引用:为对象起了另一个名字,引用即别名。
int a=1;double b=2.2;
int &c=a; //c是一个引用。
double &d=b;
int &e=b; //错误:引用类型的初始值必须是Int型对象
int &f=1; //错误:引用类型的初始值必须是一个对象
指针:
1.指针本身就是一个对象,允许对指针赋值和拷贝。
2.指针无需在定义时赋初值。
定义方式:
int *p1,*p2; //p1,p2是int型对象指针。
获取对象的地址:指针是存放某个对象的地址,若想获取,需要使用取地址符
int a=1;
int *p=&a;
cout << p <<","<< *p<<endl;
输出:
0018FC7C,1
可以看出,P为地址,*p指向这个地址的内容。
指针值
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置。
3.空指针,指针没有指向任何对象
4.无效指针,上述以外其他值
空指针:不指向任何对象,在试图使用一个指针之前,可以首先检查它是否为空。
int *p1=nullptr;
int *p2=0;
//首先需要#include cstdlib
int *p3=NULL;
建议初始化所有指针,尽量等定义了对象之后再定义指向它的指针。若不知道,则初始化为nullptr或者0。
赋值和指针
int a=1,b=2;
int *p1=0; //p1被初始化,但没有指向任何对象
int *p2=&a; //p2被初始化,存有a的地址
int *p3; //如果p3被定义在块内,则值无法确定
p3=p2; //p3和p2指向同一个对象a
p2=0; //p2不指向任何对象
p1=&b; //p1指向b
*p1=0; //b=0
void* 指针 : 可以存放任意对象地址,一个void*可以存放一个地址
double obj=3.14, *pd=&obj;
void *p=&obj;
p=pd;
指向指针的指针
int a=1024;
int *p=&a;
int **pp=&p;
int ***ppp=&pp;
cout<<a<<" "<<*p<<" "<<**pp<<" "<<***ppp<<endl;
输出都为1 。补充:**ppp=*pp=p=a的地址