金华网站建设,哪个网站做欧洲旅行比较好,永州网站seo,联合办公空间C 关键字总结
1.const
const是 constant 的缩写#xff0c;本意是不变的、不易改变的意思。在C中用来修饰内置类型变量#xff0c;自定义对象#xff0c;成员函数#xff0c;返回值#xff0c;函数参数使用如下#xff1a;
//修饰普通类型变量
const int a 7;
int ba;…C 关键字总结
1.const
const是 constant 的缩写本意是不变的、不易改变的意思。在C中用来修饰内置类型变量自定义对象成员函数返回值函数参数使用如下
//修饰普通类型变量
const int a 7;
int ba; //true
a8; //false修饰指针变量
//1.const修饰指针指向的内容则内容为不可变量
const int *p8;//2.const修饰指针则指针为不可变量
int a9;
int* const pa;
*p9; //正确
int b7;
pb; //错误指针不可变改变其地址不对//3.const修饰指针和指针指向的内容则指针和指针指向的内容都为不可变量
int a8;
const int * const pa;const 参数传递和函数返回值
//1. A值传递的 const 修饰传递一般这种情况不需要 const 修饰因为函数会自动产生临时变量复制实参值。
#includeiostream
using namespace std;void Cpf(const int a)
{couta;// a; 是错误的a 不能被改变
}int main(void)
{Cpf(8);system(pause);return 0;
}//2. 当 const 参数为指针时可以防止指针被意外篡改。
#includeiostream
using namespace std;void Cpf(int *const a)
{cout*a ;*a 9;
}int main(void)
{int a 8;Cpf(a);couta; // a 为 9system(pause);return 0;
}//3. 自定义类型的参数传递需要临时对象复制参数对于临时对象的构造需要调用构造函数比较浪费时间
//因此我们采取 const 外加引用传递的方法并且对于一般的 int、double 等内置类型我们不采用引用的传递方式。
#includeiostream
using namespace std;class Test
{
public:Test(){}Test(int _m):_cm(_m){}int get_cm()const{return _cm;}private:int _cm;
};void Cmf(const Test _tt)
{cout_tt.get_cm();
}int main(void)
{Test t(8);Cmf(t);system(pause);return 0;
}const 修饰函数的返回值
//1. const 修饰内置类型的返回值修饰与不修饰返回值作用一样。
#includeiostream
using namespace std;const int Cmf()
{return 1;
}int Cpf()
{return 0;
}int main(void)
{int _m Cmf();int _n Cpf();cout_m _n;system(pause);return 0;
}//2. const 修饰自定义类型的作为返回值此时返回的值不能作为左值使用既不能被赋值也不能被修改。//3. const 修饰返回的指针或者引用是否返回一个指向 const 的指针取决于我们想让用户干什么。const修饰类成员函数
//const 修饰类成员函数其目的是防止成员函数修改被调用对象的值
//如果我们不想修改一个调用对象的值所有的成员函数都应当声明为 const 成员函数。
#includeiostream
using namespace std;class Test
{
public:Test(){}Test(int _m):_cm(_m){}int get_cm()const{return _cm;}private:int _cm;
};void Cmf(const Test _tt)
{cout_tt.get_cm();
}int main(void)
{Test t(8);Cmf(t);system(pause);return 0;
}
//***************************************************
class Test
{
public:Test(int _m,int _t):_cm(_m),_ct(_t){}void Kf()const{_cm; // 错误_ct; // 正确}
private:int _cm;mutable int _ct;
};2.inline 引入inline关键字原因 在 c/c 中为了解决一些频繁调用的小函数大量消耗栈空间栈内存的问题特别的引入了 inline 修饰符表示为内联函数。栈空间就是指放置程序的局部数据也就是函数内数据的内存空间。在系统下栈空间是有限的假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题如函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 内联函数并不是一个增强性能的灵丹妙药。只有当函数非常短小的时候它才能得到我们想要的效果但是如果函数并不是很短而且在很多地方都被调用的话那么将会使得可执行体的体积增大。
下面我们来看一个例子
#include stdio.hinline const char *num_check(int v)
{return (v % 2 0) ? 奇 : 偶;
}int main(void)
{int i;for (i 0; i 100; i)printf(%02d %s\n, i, num_check(i));return 0;
}3. static 静态全局变量 该变量在全局数据区分配内存未经初始化的静态全局变量会被成需自动初始化为0静态全局变量在声明它的整个文件都是可见的而在文件之外是不可见的静态全局变量都在全局数据区分配内存包括后边将要提到的静态局部变量。对于一个完整程序在内存中的分布情况为代码区//low address全局数据区堆区栈区//high address一般程序把新产生的动态数据存放在堆区函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间静态数据即使是函数内部的静态局部变量也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。//示例1
#include iostream
using namespace std;
void fn(); //声明函数
static int n; //声明静态全局变量
int main()
{n 20; //为n赋初值coutnendl;//输出n的值fn(); //调用fn函数
}
void fn()
{n; //n的值自加一nn1coutnendl; //输出n的值
}静态全局变量和全局静态变量的区别 1全局变量是不显视用static修饰的全局变量全局变量默认是有外部链接性的作用域是整个工程在一个文件内定义的全局变量在另一个文件中通过extern 全局变量名的声明就可以使用全局变量。2全局静态变量是显式用static修饰的全局变量作用域是声明此变量所在的文件其他的文件即使用extern声明也不能使用。
//示例2
//File1.c第一个代码文件的代码
#include iostream
using namespace std;
void fn(); //声明fn函数
static int n; //定义静态全局变量
int main()
{n 20;coutnendl;fn();
}
//File2.c第二个代码文件的代码
#include iostream
using namespace std;
extern int n;
void fn()
{n;coutnendl;
}编译并运行Example 2您就会发现上述代码可以分别通过编译但运行时出现错误。试着将 static int n; //定义静态全局变量 改为 int n; //定义全局变量 再次编译运行程序细心体会全局变量和静态全局变量的区别。 静态局部变量 该变量在全局数据区分配内存静态局部变量在程序执行到该对象的声明处时被首次初始化即以后的函数调用不再进行初始化静态局部变量一般在声明处初始化如果没有显式初始化会被程序自动初始化为0它始终驻留在全局数据区直到程序运行结束。但其作用域为局部作用域当定义它的函数或语句块结束时其作用域随之结束
//示例3
#include iostream
using namespace std;
void fn();
int main()
{fn();fn();fn();return 0;
}
void fn()
{static int n 10;coutnendl;n;
}静态函数 静态函数不能被其他文件所用其他文件中可以定义相同名字的函数不会发生冲突 面向对象(类)中的静态属性使用 静态数据成员 1静态数据成员可以实现多个对象之间的数据共享它是类的所有对象的共享成员它在内存中只占一份空间如果改变它的值则各对象中这个数据成员的值都被改变。2静态数据成员是在程序开始运行时被分配空间到程序结束之后才释放只要类中指定了静态数据成员即使不定义对象也会为静态数据成员分配空间。3静态数据成员可以被初始化但是只能在类体外进行初始化若未对静态数据成员赋初值则编译器会自动为其初始化为 0。4静态数据成员既可以通过对象名引用也可以通过类名引用。 静态成员函数 1静态成员函数和静态数据成员一样他们都属于类的静态成员而不是对象成员。2非静态成员函数有 this 指针而静态成员函数没有 this 指针。3静态成员函数主要用来方位静态数据成员而不能访问非静态成员。
再给一个利用类的静态成员变量和函数的例子以加深理解这个例子建立一个学生类每个学生类的对象将组成一个双向链表用一个静态成员变量记录这个双向链表的表头一个静态成员函数输出这个双向链表。
#include stdio.h
#include string.h
const int MAX_NAME_SIZE 30; class Student
{
public: Student(char *pszName);~Student();
public:static void PrintfAllStudents();
private: char m_name[MAX_NAME_SIZE]; Student *next;Student *prev;static Student *m_head;
}; Student::Student(char *pszName)
{ strcpy(this-m_name, pszName);//建立双向链表新数据从链表头部插入。this-next m_head;this-prev NULL;if (m_head ! NULL)m_head-prev this;m_head this;
} Student::~Student ()//析构过程就是节点的脱离过程
{ if (this m_head) //该节点就是头节点。{m_head this-next;}else{this-prev-next this-next;this-next-prev this-prev;}
} void Student::PrintfAllStudents()
{for (Student *p m_head; p ! NULL; p p-next)printf(%s\n, p-m_name);
}Student* Student::m_head NULL; void main()
{ Student studentA(AAA);Student studentB(BBB);Student studentC(CCC);Student studentD(DDD);Student student(MoreWindows);Student::PrintfAllStudents();
}程序将输出