inline和static的区别
a.cpp中有如下代码程序代码:
inline int a=100; void func() { std::cout<<a }
b.cpp中有如下代码
程序代码:
void func(); inline int a=200; int main() { func(); |
结果是100还是输出200呢?
inline int a=100; void func() { std::cout<<a }
void func(); inline int a=200; int main() { func(); |
关键字: inline 概述: 如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 解析: 在程序编译阶段,编译器把每次调用函数的地方直接替换为函数体中的代码,避免频繁的开辟函数栈。 注: 内联函数中不能包含有 循环语句、switch语句、goto语句、数组、递归函数,如果包含则忽略关键字inline,即为非内联函数 语法: inline 返回值类型 函数名(参数列表) { //函数体 } 示例: #include <stdio.h> //函数定义为inline即:内联函数 inline char* dbtest(int a) { return (i % 2 > 0) ? "奇" : "偶"; } int main() { int i = 0; for (i=1; i < 100; i++) { //把 函数调用 dbtest(i) 替换为 函数体中的代码 (i % 2 > 0) ? "奇" : "偶"; printf("i:%d 奇偶性:%s /n", i, dbtest(i)); } }
关键字: static 概述: 在变量定义时就分配好存储单元并保持不变,直至整个程序结束才销毁.可分为静态局部变量和静态全局变量 解析: 静态局部变量: 在程序中的该程序块区域中可以访问的变量,函数结束不销毁,保留原值。该源程序结束时销毁 特性: 该变量在全局数据区分配内存; 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化; 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0; 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束; 静态全局变量: 在程序中的该源文件中可以访问的变量,该源文件结束时销毁 作用域: 当前文件中 注: 1. 静态成员只能访问静态成员,不能访问非静态成员, 可以使用实例化指针访问 2. 实例成员可以访问静态成员,和实例成员 示例: 1. 静态/非静态局部变量 #include <stdio.h> #include<stdlib.h> int main() { void test(); for (int i = 0; i < 5; i++) { test(); } system("pause"); return 0; } void test() { //非静态局部变量(auto),默认方式, 每次调用不保留原值 int x = 0; //静态局部变量(static),函数结束时不销毁,保留原值,文件结束时销毁 static int y = 0; x++; y++; printf_s("x = %d, y = %d\n", x, y); } =======================运行结果======================= x = 1, y = 1 x = 1, y = 2 x = 1, y = 3 x = 1, y = 4 x = 1, y = 5 2. 同文件中类的静态成员变量/函数 #include <iostream> #include <cstdlib> using namespace std; class Cname { public: Cname(int x) { a = x; } int print() { return this->a + this->c; } //静态成员函数 static void yy() { //访问静态成员 不可以使用this指针 // this -> c cout << "静态成员函数 c = " << c << endl; } private: int a; //类的静态私有(初始化需要在类外初始化) //静态变量定义后基值不会改变,直至整个程序结束才销毁 static int c; public: static int d; }; int Cname::d = 10; //初始化Cname类成员变量 c 的值 // :: 作用域操作符 int Cname::c = 5; int main() { Cname c1(10); Cname c2(20); cout << "对象 c1的返回值:" << c1.print() << endl; cout << "对象 c2的返回值:" << c2.print() << endl; c2.yy(); cout << Cname::d << endl; system("pause"); return 0; } 3. 类的静态成员声明及初始化 cmy.h================================================== #pragma once class cmy { public: cmy(); ~cmy(); static int c; static void test(); }; cmy.cpp=================================================== #include "stdafx.h" #include "cmy.h" // 声明静态成员并初始化 int cmy::c = 10; // 声明静态成员 cmy::cmy() { } cmy::~cmy() { } void cmy::test() { printf("类的静态函数"); } 主函数===================================================== #include "stdafx.h" #include "cmy.h" #include <stdlib.h> int main() { cmy m_cmy; m_cmy.test(); printf("类的静态成员 %d\n", m_cmy.c); system("pause"); return 0; } 4. 类的静态成员访问非静态成员 1. 函数传递 class Cmy{ void test(Cmy *m_cmy) { m_cmy-> 非静态成员; } } static Cmy m_my; m_my.test(&m_my); 2. this指针传递(或使用构造函数,或非静态函数) class Cmy{ void test1() { m_cmy = this; } static void test2() { m_cmy-> 非静态成员; } static Cmy *m_cmy } 3. 全局变量(不推荐) Cmy m_my; class Cmy{ } 4. 导入外部的静态成员 注:只允许本文件使用 ===================================a.cpp========================================= #include<stdio.h> #include<stdlib.h> //导入外部静态变量 extern int a; //导入外部静态函数 extern void test(); //声明外部非静态函数 extern void test2(); int main() { //外部静态变量,不允许跨文件使用 //++a; //外部静态函数,不允许跨文件使用 //test(); //调用外部函数 test2(); system("pause"); return 0; } ===================================b.cpp========================================= #include <stdio.h> //定义外部静态全局变量 - 只允许本文件使用 static int a = 10; //定义外部静态函数 - 史允许本文件使用 static void test() { printf_s("外部的函数 a = %d\n", a); } //非静态函数 void test2() { test(); } ==================================================================================