#共用体:union
能够存储不同的数据类型,但同时只能存储其中的一种类型。
与结构体的区别:
结构体:同时存储 char,int和double类型。
共用体:只能存储char、int或double类型。
共用体的长度:其中的最大成员的长度。
用途之一:当数据项使用两种或者两种以上的数据类型但不同时使用其时,使用共用体可以节省空间。
注:当内存以GB或者是TB为单位时,节约内存貌似没有多大必要。但是在嵌入式系统编程时,节约内存就显得很有必要。
#函数:function
组成:由函数名以及一组操作数类型唯一地表示。
函数的操作数:形参。
函数的运算在函数体(function body)的块语句中定义。
1.函数的调用:用对应的实参初始化形参,并将控制权移交给被调用函数,主调函数被挂起,被调函数开始执行。
2.函数体是一个作用域:定义局部变量, 只能在该函数体内调用。当执行到return语句时,函数调用结束。
3.形参和实参:形参在函数的形参表中定义的,由调用函数提供的实参提供初始化。
函数的返回类型:在定义或者申明函数时,必须指明函数返回的类型。没有显式指定返回类型是不合法的。
函数形参表:函数形参表可以为空,但不能省略。没有任何形参的函数可以用空形参表或者含有单个关键字void的形参表来表示。
例如以下是等价的:
void process(){/*.......................*/}
void process(void){/*.......................*/}
形参表由一系列用逗号分隔的参数类型和参数名组成。如果两个参数具有相同的类型,则两个类型必须重复申明。
例如:
int manip(int v1,v2) {/*.......................*/}//error
int manip(int v1,int v2) {/*.......................*/}//OK
#类
定义类的时候不能对成员变量赋值,因为类知识一种数据结构,不占用内存空间,而变量的存储需要占用内存空间来储存。
类的成员函数和普通函数一样,也有返回值和形参列表。
类的成员函数与普通函数的区别:成员函数是一个类的成员,定义在类体中,其作用范围由类决定。而普通函数是独立的,作用范围是全局的,或者是定义于某个作用域内。
类体中的内联函数:如果在类体外定义 inline 函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中),否则编译时无法进行嵌入(将函数代码的嵌入到函数调用出)。这样做虽然提高了程序的执行效率,但从软件工程质量的角度来看,这样做并不是好的办法,因此实际开发中较少在类中使用内联函数。
类的访问限定符:public,protected,private。
访问权限分为两部分:类内和类外。
1>在类内,不论成员变量还是成员函数被申明为public,protected还是private,都是可以相互访问的,无访问权限限制。
2>在类外,通过对象访问是无法访问protected和private属性的成员函数和成员变量,而可以访问public属性的成员变量和成员函数。
3>protected申明的成员变量或成员函数,即使是在类外也是无法访问的
特别说明:
1)private和public申明的次序无关紧要,private或者public申明类成员属性或方法两者次序可任意放置。但是,如果不申明为private或者public属性时,即默认为private属性的类属性和方法。
2)虽然private和public可以在类定义中出现多次,但是为了程序清晰,应该养成在一个类中只有一个private和仅有一个public。
以下的格式也是正确的:
class <span style="color:#ff0000;">Student</span>{
<span style="color:#ff0000;">private:</span>
char *name;
private:
int age;
float score;
public:
void setname(char *name1){
name = name1;
}
void setage(int age1){
age = age1;
}
public:
void setscore(float score1){
score = score1;
}
void say(){
printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
}
};
#类::构造函数
构造函数是一种特殊的成员函数,其函数名和类名相同,无返回值,不需要被用户调用,在创建对象时自动执行。构造函数最常见的功能是创建对象时进行初始化工作,最常见的就是对成员变量赋值。
一旦在类中定义了构造函数,则在创建对象是一定会被执行。
构造函数主要用来对变量进行初始化,没有返回值。
因此:
1)构造函数不能有任何函数类型。
2)不能有return用于返回任何类型的值。
#类::默认构造函数
如果用户不定义一个类对应的构造函数,那么编译器会自动生成一个构造函数,这个构造函数不执行任何操作,函数体为空,没有任何参数。
比如一个Student类中对应的默认构造函数为:Student(){ }
一个类,必须要有构造函数,要么用户定义,要么编译器自动生成。
#多个文件单独编译
为了增加代码的可移植性,一般将代码分成以下三个部分:
1)头文件:包含程序的结构声明和使用这些结构的函数的原型。
2)源代码文件:包含了与结构有关的函数代码。
3 )源代码文件:包含了调用与结构相关的函数的代码。
但是,请不要将函数定义或者变量声明放到头文件中,这样做对于简单的情况可能是可行的。不过会招致不必要的麻烦,例如,如果在头文件中包含一个函数的定义,然后
在其他两个文件(属于同一个程序)中包含该头文件,则同一个程序中将包含同一个函数的两个定义。除非函数是内联的,否则函数将出错。
下面列出了头文件中常包含的内容:
1)函数原型(函数申明)
2)使用#define或者const定义的符号常量
3)结构声明
4)类声明
5)模板声明
6)内联函数
自定义的头文件被其他源文件包含时,通常使用“ ”双引号的形式包含,例如#include “ Student.h ”,而不是#include<Student.h>的形式包含。其区别是使用双引号包含的头
文件首先在源程序目录下搜索,如果未搜索到则转到编译器头文件目录下搜索,而使用一对尖括号包含的头文件只能在编译器包含的头文件目录下搜索。
同一个文件中只能将同一个头文件包含一次。经常在不知情的情况下包含多次,解决这个问题,有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理
器编译指令#ifndef(if not defined)、以下的代码片段意味着仅当以前没有使用预处理编译指令#define定义名称COORDIN_H_时,才处理#ifndef和#endif之间的语句:
#ifndef COORDIN_H_
............
............
#endif
编译器首次遇到该文件时,名称COORDIN_H_没有被定义,这种情况下,编译器将执行#ifndef 和#endif之间的部分。