本文共 8065 字,大约阅读时间需要 26 分钟。
变量的声明与使用
。AboutVariable.h
,接下来的所有与变量相关的代码都会在这个头文件中编辑。市面上很多C/C++编程基础学习的书籍,都有一个通病,那就是每个简单的基础示例都要新建一个工程项目,简直就是大材小用、浪费磁盘空间。你跟着我学习,我将带领你体验把整个编程基础阶段的代码组织在同一个工程项目的经验,这对你以后复习也是相当用帮助的。由 C/C++ 官方提供的,即只要装了运行环境就可以使用的数据类型
。数字型数据类型和字符型数据类型,以及一个特殊的无类型(void)
,前者又可以进一步地根据数据的组织形式划分为:无符号整型(unsigned)、整型(短整形short、整型int和长整型long)、单精度浮点数(float)、双精度浮点数(double)和布尔型(bool)
;而字符型的细分便比较少,只分为普通字符型(char)和宽字符型(wchar_t)。unsigned、short、long
可以作为修饰符进行组合放在 int 前面,例如:short int、long int 、unsigned short、unsigned long int 等,都是合法的(指符合C/C++语法,而非现实中的法律法规
);long 可以修饰 double。操作系统内部,会根据变量声明语句给程序分配寄存器或内存单元
),并且变量声明之后,在使用之前必须进行一次初始化。这是为什么呢?垃圾数据
,你可以像我下面要做的一样,在 Visual Studio 跑一跑下面的代码,看看控制台会输出什么内容?void testRubbishDatum(void){ int a; cout << "未初始化的变量a的内容:" << a << endl;}
Type variable; // 单独声明变量不进行初始化variable = Initial_data;// 单独进行初始化Type variable = initial_data; // 声明的同时进行初始化
void templateOfUsingDataType(void){ int a; cin >> a; int b = 1456; printf("a=%d\n", a); cout.width(6); cout.fill('#'); cout << setiosflags(ios::right); cout << b << endl;}
全局变量和局部变量
,记住这个全局
不是一个静态的,是一个动态的范围,例如,一个头文件没有被工程项目里的其他头文件或源文件引用的情况下,那么此时的“全局”仅限于当前头文件,而一旦被某个头文件或源文件引用了,那么此时的“全局”由当前头文件和引用该头文件的文件两个文件范围构成。指在任何函数体外、直接在文件中声明的变量
,相反的,在某个函数体内声明的变量就是局部变量
。因此,我们此前使用的变量都是局部变量。全局变量在声明全局内,无论哪个函数都可以使用,而局部变量则只能在所声明的函数体内使用;因此,我们通常将全局变量作为公有变量,而局部变量则作为私有变量或临时变量。// 假设这个代码块就是一个头文件int a; // 这是一个全局整形变量void afun(void){ int b; // 这是一个整型局部变量}void anotherfun(void){ a=10; // 因为 a 是全局变量,因此 a 在这里有效 b=1; // 错误,因为 b 只是 afun 中的局部变量}void alsoanotherfun(void){ afun(); b=1; // 错误,函数体的范围不能通过引用进行扩展,头文件才可以}
只有头文件可以通过被引用来扩展有效范围,函数不能通过被引用来扩展有效范围
。为了避免因变量范围问题造成程序错误,就一定要注意好变量的范围。一个函数想要使用其他函数体内的局部变量,唯有通过传参
,这个不是当前的学习重点,传参会放在后面的函数的详细讲解中。宏定义法和const修饰法
。宏定义,一般在文件头部,用 define
关键字进行声明,其格式:#define varname data
;而 const 修饰法就是在普通变量的声明方式的基础上加用 const 修饰,例如:const int a = 5;
。这两种方式在实际使用时,有如下区别,宏定义法通常用于声明全局常量,而 const 修饰法大多用于声明局部常量。看下面的一个例子: static
关键字,例如 :static int a = 10;
。进行修饰的。静态变量也分为全局静态和局部静态。下面我给出一个例子,带领大家体验静态变量的特点。void fun(int &num1, int &num2){ static int a=12; int b = 10; b=b+1; a=a+12; num1=b; num2=a;}int main(int argc, char** argv) { int x1=0,y1=0,x2=0,y2=0; fun(x1,y1); std::cout<<"x1="<<<",y1="< <
x1=11,y1=24x2=11,y2=36
字符串不是基本数据类型
)。静态数组和动态数组(指针数组)
。静态数组是在程序栈上申请分配空间,而动态数组则是在堆上申请分配空间。注意,这里的栈堆是一种数据结构、系统提供的数据结构,不是这里的学习重点,因此你只要记住:静态数组和动态数组申请分配的空间是不一样的
。type var_name[length]; // 静态数组声明// 例如声明一个长度为 10 的整形数组:int a[10];type* var_name = new type[length]; // 动态数组声明,示例如下:int* a = new int[10];int length=10;int *b = new int[length];
int a[5] = { 12, 5, 47, 9, 6];char s[6] = "abcde\0";// 这是第一种数组初始化方式,字符数组的声明长度要比实际长度多一个单位,因为字符串必须有结束符int a[] = { 12, 5, 47, 9, 6];char s[] = "abcde\0";// 第二种方式,与第一种的区别就是没有显式指定数组长度// 这两种方式都是将目的数据直接赋给数组,//下面的就是不赋值目标数据,而是先用一个初始数据,此时就必须显式指定数组长度int a[5] = { 0];char s[6] = "";// 单独初始化的方式// 数字数组和字符数组稍微有点不同int a[5];for(int i=0;i<5;i++) cin>>a[i];char s[5];cin>>s; // 注意只能最多输入5个字符
// 数组名[下标值] 下标从0开始,因此长度为 10 的数组,其有效下标范围是0~9(length-1)int a[5] = { 12, 5, 47, 9, 6];char s[6] = "abcde\0";a[2];s[1];
数组名[下标]=新值
的方式进行。二维数组声明方式如下:
int a[3][3] = { { 1,2,3},{ 1,2,3},{ 1,2,3}} // 可以简单理解为二维数组的元素是一个一维数组 char s[2][3] = { "12\0","12\0"}; // 二位字符数组以字符串为元素 // 二维静态数组单独初始化 int b[5][6] for(int i<5;i++) for(int j=0;j<6;j++) b[i][j]=data; // cin>>b[i][j]; // 二位动态数组声明,要记牢 int **a = new int*[5]; for(int i=0;i<5;i++) a[i] = new int[5]); // 二维动态数组初始化,和静态二维数组单独初始化的方式一样
二维数组取值,通过两个下标确定,就如上进行初始化赋值时的代码。
不可以!
。静态数组,就我所知的编译器中,还不支持通过三个中括号连用的形式来声明三位数组;动态数组却可以通过连用三个*
来声明三位数组:int ***p; // 这就是一个三位数组 p = new int**[length]; for(int i=0;i
int ***p; // 这就是一个三位数组 int length = 5; p = new int**[length]; for(int i=0;i
结构体
,而在C++ 中则称类体
。struct
。// 说明以下,typedef 并不是声明结构体的必要,可以加或不加,加的话是为了能够给结构体另取名字struct [struct_name]{ type1 member1; //成员变量1 type2 member2; // 成员变量2 ……};typedef struct [struct_name]{ type1 member1; type2 member2; ……}[another_struct_name];
成员变量
。struct MyStudent{ char name[12]; //学生姓名 int age; // 学生年龄 bool sex; // 1-boy,0-girl};
StructNmae varName; StructName* varName = new StructName;
struct MyStudent{ public: char name[12] = "Tom"; //学生姓名 int age = 24; // 学生年龄 bool sex = 1; // 1-boy,0-girl};void testMyStudent(void){ MyStudent stu01; MyStudent* stu02 = new MyStudent; cout << "name=" << stu01.name << ",age=" << stu01.age << ",sex=" << stu01.sex << endl; cout << "name=" << stu02->name << ",age=" << stu02->age << ",sex=" << stu02->sex << endl;}
标准 C++ 就是一切都要以 C++ 的语法进行
,在标准 C++ 中,声明自定义类型,通过类来进行。class
进行声明class class_name{ public: type01 member01; // 成员1 type02 member02; // 成员2 ……};
不允许成员变量声明的同时进行初始化
。实例化
,同样的以学生信息进行类声明与简单实例化:class Student{ public: char name[12] = "Tom"; //学生姓名 int age = 24; // 学生年龄 bool sex = 1; // 1-boy,0-girl};void testStudent(void){ Student stu; cout << "name=" << stu.name << ",age=" << stu.age << ",sex=" << stu.sex << endl; Student* stu02 = new Student; cout << "name=" << stu02->name << ",age=" << stu02->age << ",sex=" << stu02->sex << endl;}
转载地址:http://shqgn.baihongyu.com/