首页 > 编程语言 >C++ 类和结构体内外的Static

C++ 类和结构体内外的Static

时间:2023-08-20 16:33:49浏览次数:29  
标签:std namespace C++ cpp static using fun Static 体内

类和结构体外的Static

这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。

下面是几组例子来理解:

例子1:

main.cpp

#include <iostream>

using namespace std;

void fun(){
    cout << "fun() in main.cpp" << endl;
}

int main()
{
    fun();
    return 0;
}

static.cpp

#include<iostream>

using namespace std;

static void fun(){
    cout << "static fun() in static.cpp" << endl;
}

编译将不会报错,运行结果:

fun() in main.cpp

此时static.cpp中的fun()因为被static修饰,只在static.cpp中有效。

例子2:

main.cpp

#include <iostream>

using namespace std;

void fun(){
    cout << "fun() in main.cpp" << endl;
}

int main()
{
    fun();
    return 0;
}

static.cpp

#include<iostream>

using namespace std;

void fun(){
    cout << "static fun() in static.cpp" << endl;
}

编译后报错,无法运行,函数名重复了

例子3:

main.cpp

#include <iostream>

using namespace std;

int main()
{
    fun();
    return 0;
}

static.cpp

#include<iostream>

using namespace std;

static void fun(){
    cout << "static fun() in static.cpp" << endl;
}

编译后报错,无法运行,找不到fun()函数

例子4:

main.cpp

#include <iostream>

using namespace std;

extern void fun();

int main()
{
    fun();
    return 0;
}

static.cpp

#include<iostream>

using namespace std;

static void fun(){
    cout << "static fun() in static.cpp" << endl;
}

编译后报错,无法运行,找不到fun()函数(static.cpp中的fun()函数只在static.cpp生效,不能被main.cpp extern)

例子5:

main.cpp

#include <iostream>

using namespace std;

extern void fun();

int main()
{
    fun();
    return 0;
}

static.cpp

#include<iostream>

using namespace std;

void fun(){
    cout << "fun() in static.cpp" << endl;
}

编译不会报错,运行结果:

fun() in static.cpp

static.cpp的fun()没被static修饰,可以被extern,此时main.cpp中的fun()调用的是static.cpp中的fun()

类和结构体中的Static

类/结构体中的static,表明这个符号在这个类的所有对象共用。不属于任何一个对象。调用时直接用命名空间来访问这个符号。(函数内的静态变量不做讨论,和C语言是一样的)

下面是一些例子:

没有使用static:

#include <iostream>

using namespace std;

class Player{
public:
    int x = 0, y = 0;
    void move(int xa, int ya){
        cout << "move from (" << x << "," << y << ") to \
(" << x+xa << "," << y+ya << ")" << endl;
        x += xa;
        y += ya;
    };
};

int main()
{
    Player player;
    player.move(2,7);
    player.move(3,5);
    return 0;
}

静态成员变量:

#include <iostream>

using namespace std;

class Player{
public:
    static int x, y;
    void move(int xa, int ya){
        cout << "move from (" << x << "," << y << ") to \
(" << x+xa << "," << y+ya << ")" << endl;
        x += xa;
        y += ya;
    };
};

int Player::x;
int Player::y;

int main()
{
    Player player1;
    Player player2;
    Player::x = 3;
    Player::y = 6;
    Player::y = 6;
    player1.move(2,7);
    player2.move(3,5);
    return 0;
}

静态成员方法

  • 注意,类中静态方法不能访问非静态成员。
#include <iostream>

using namespace std;

class Player{
public:
    int x = 0, y = 0;
    static void move(Player& player, int xa, int ya){
        cout << "move from (" << player.x << "," << player.y << ") to \
(" << player.x+xa << "," << player.y+ya << ")" << endl;
        player.x += xa;
        player.y += ya;
    };
};

int main()
{
    Player player;
    Player::move(player, 2, 7);
    Player::move(player, 3, 5);
    return 0;
}

标签:std,namespace,C++,cpp,static,using,fun,Static,体内
From: https://www.cnblogs.com/orzmiku/p/17644200.html

相关文章

  • C++ 继承
    继承一个类可以继承另一个类,避免了代码复写。被继承的类被叫做基类,继承的类叫做派生类。(或者说是父类和子类)继承类型当一个类派生自基类,该基类可以被继承为public、protected或private几种类型。继承类型是通过上面讲解的访问修饰符access-specifier来指定的。我们几乎......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......
  • C++ 变量初始化总结
    堆空间,new操作初始化1、对于有自己写构造函数的类,不论类型名后面有没有括号()或者数组[],都用构造函数进行初始化,如果构造函数delete,则编译报错;2、如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,3、而加了括号()的new会在分配内存的同时初始化为0。栈空间......
  • c++基础入门
    1.安装g++编译器是编译C++代码使用的编译器,不要使用gcc了。在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令cd文件夹sudodpkg-i*.deb本地安装sudoapt-getinstallg++在线安装2.C++的语言特点及优势cwithclass(类)cplusplus大型......
  • c++算法之动态规划:01背包
    什么是动态规划?动态规划算法(dynamicprograming),是一种由递推为基础的比贪心更稳定的一种优化策略,为运筹学的一部分。就是通过以递推为基础的手段非暴力求出最值。它的总体思想其实就是一个比较过程:假如你有一个数据,它的价值是x,代价为y,如果用动态规划就是和你不加这个元素和你加......
  • C/C++ 中 static 关键字解析
    局部静态变量的特点:全局数据区执行到函数内对象声明处首次初始化,若没有显示初始化,自动初始化为0,且只初始化一次始终驻留在全局区,直到程序结束,作用域为局部作用域,在函数或语句块内,生命周期到程序结束全局静态变量的特点:全局区在main函数执行前分配内存并初始化注意:......
  • 使用WebAssembly实现高性能计算:C++和Rust的案例分析
    WebAssembly是一种新型的低级字节码格式,它可以在浏览器中运行高效的编译代码。使用WebAssembly可以实现高性能计算、游戏引擎等功能,对于需要大量计算的Web应用程序来说尤为重要。本文将介绍使用WebAssembly实现高性能计算的两个案例:C++和Rust。C++C++是一种高性能的编程语言,它......
  • C++入门:内联函数
    1.概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。查看方式:1.在release模式下,查看编译器生成......
  • C++ 突袭
    基本知识必须在函数声明中声明默认参数!默认参数必须在形参列表的结尾!避免歧义函数声明就是函数的身份证,外部调用方不看定义只看声明和取地址类似函数overload函数重载要求:函数的名字相同参数列表(数量,类型)不同注意:与返回值无关问题--避免overlo......
  • C++序列化封装EasySerialize
      最近在做C++项目,需要序列化和反序列化json以及xml数据。可能是由于用惯了C#等更高度化语言,搜了一遍,发现C++没有特别方便使用的序列化、反序列化的库。大部分库都是为了实现功能(非常感谢这些实现库的作者),使用时,需要根据字段深度定义结构体字段(这一步无法省略),然后再使用手动编......