文章目录

  • 一、函数返回地址的情形
    • 1、函数返回值为指针
  • 二、static关键字用法整理
    • 1、static全局变量
    • 2、static局部变量
    • 3、static函数
    • 4、类的static成员数据
    • 5、类的static成员函数

一、函数返回地址的情形

1、函数返回值为指针

如下例中,函数func要求返回值int类型的指针,实际返回的就是数组aa[idx]的地址。

#include <iostream>using namespace std;int a[100] = { 0, 1, 2, 3, 4, 5, 6 };int* func(int idx)
{return &a[idx];
}int main()
{int* b = func(3);cout << b[2] << endl;  // 5return 0;
}

二、static关键字用法整理

1、static全局变量

在全局变量前加上static关键字,可以声明为static全局变量。

static全局变量有以下特点:

  • 在内存区中的【数据区】分配内存
  • 未初始化的static全局变量将会自动初始化为0
  • 在声明static全局变量的文件内可调用、文件外不可调用,因此在不同文件中可以取同名的static全局变量而不会冲突
  • 作用域全局范围

使用示例:

#include <iostream>using namespace std;static int a;int main()
{cout << a << endl;  // 0return 0;
}

2、static局部变量

在局部变量前加上static关键字,可以声明为static局部变量。

static局部变量有以下特点:

  • 在内存区中的【数据区】分配内存
  • 未初始化的static局部变量将会自动初始化为0
  • 只在程序第一次执行到声明的时候初始化,以后不再重复执行
  • 作用域为局部作用域

使用示例:

#include <iostream>using namespace std;int func()
{static int a;  // 自动初始化为0,声明语句的初始化只执行一次++a;return 2 * a;
}int main()
{cout << func() << endl;  // 2cout << func() << endl;  // 4cout << func() << endl;  // 6return 0;
}

3、static函数

在函数声明前加上static关键字,可以声明为static函数。

static函数有以下特点:

  • 在声明static函数的文件内可调用、文件外不可调用,因此在不同文件中可以取同名的static函数而不会冲突

使用示例:

static int func();static int func()
{return 1;
}

4、类的static成员数据

在类的成员数据前加上static关键字,可以声明为static成员数据。

static成员数据有以下特点:

  • 在内存区中的【数据区】分配内存
  • 名字不会与全局中同名的变量名冲突
  • 可以看成是整个类的成员数据,被所有对象共有,在所有对象前保持一致
  • 既可以通过类来访问,也可以通过对象来访问
  • 和普通的成员数据一样拥有publicprotectedprivate这些访问权限修饰符
  • 需要在源文件中进行初始化(格式参考下例)

使用示例:

#include <iostream>using namespace std;class A
{public:A() { ++num; }~A() { --num; }static int num;
};int A::num = 0;int main()
{A a1, a2;cout << A::num << endl;  // 2cout << a1.num << endl;  // 2{A a3;cout << A::num << endl;  // 3cout << a3.num << endl;  // 3}cout << A::num << endl;  // 2cout << a1.num << endl;  // 2return 0;
}

5、类的static成员函数

在类的成员函数前加上static关键字,可以声明为static成员函数。

static成员数据有以下特点:

  • 只能访问static成员数据、调用static成员函数,不能访问其他成员数据、调用其他成员函数
  • 既可以通过类来访问,也可以通过对象来访问
  • 不具有this指针
  • 不能被标记为const成员函数

使用示例:

#include <iostream>using namespace std;class A
{public:A() { ++num; }~A() { --num; }static int getNum() { return num; }
private:static int num;
};int A::num = 0;int main()
{A a1, a2;cout << A::getNum() << endl;  // 2cout << a1.getNum() << endl;  // 2{A a3;cout << A::getNum() << endl;  // 3cout << a3.getNum() << endl;  // 3}cout << A::getNum() << endl;  // 2cout << a1.getNum() << endl;  // 2return 0;
}

《编码规范和测试方法——C/C++版》作业 ·002——函数返回地址、static关键词用法整理相关推荐

  1. 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数

    文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...

  2. 《编码规范和测试方法——C/C++版》学习笔记 ·001

    文章目录 一.编码规范的目的 二.相关知识补充 1.32位机下C++中各变量占用的字节数 2.按位操作 三.规范事项 1.把常量放在==左边 2.按位位移操作的右操作数必须小于操作的位数 3.不要对有 ...

  3. 《编码规范和测试方法——C/C++版》作业 ·008——编写一个符合依赖倒置原则的简单学生管理系统

    文章目录 问题描述 参考解答 整体架构 UML图 整体代码 MySQL-C-API封装 Model层 Dao层 Service层 Controller层 View层 主程序 测试环境 测试流程 测试效 ...

  4. 《编码规范和测试方法——C/C++版》作业 ·007——C++引入MySQL给C的API并简单封装

    文章目录 问题描述 参考解答 API引入 API测试 一些问题 封装代码 测试环境 测试代码 测试结果 问题描述 使用MySQL为C提供的API,封装出一个访问MySQL数据库的类.要求至少能实现如下 ...

  5. 《编码规范和测试方法——C/C++版》作业 ·006——设计模式 · 模板方法

    文章目录 一.设计模式-模板方法 1.简单介绍 2.框架演示 3.实际案例 一.设计模式-模板方法 1.简单介绍 简单来说,就是先在父类FFF中定义好一个函数AAA,然后这个函数AAA代表了一个操作M ...

  6. 《编码规范和测试方法——C/C++版》作业 ·005——设计一组员工类

    问题描述 Cola公司的雇员分为以下若干类:ColaEmployee :所有员工总的父类属性:员工的姓名,员工的生日月份方法:getSalary(int month) 根据参数月份来确定工资,如果该月 ...

  7. 《编码规范和测试方法——C/C++版》作业 ·004——设计一个顺序表

    问题描述 实现一个能够实现自动扩容ArrayList类的封装(不使用C++容器),主要至少具有增加.删除.求长的功能 参考解答 ArrayList.h文件 #ifndef ARRAYLIST_H #d ...

  8. 《编码规范和测试方法——C/C++版》学习笔记 ·002

    文章目录 一.相关知识补充 1.switch接受的参数类型 2.内存分区与数据存放 3.变量的作用域与生命期 4.调试开关的使用 二.规范事项 1.杂项 (1).for循环语句中只出现影响循环控制的变 ...

  9. python编码规范手册-PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

最新文章

  1. python中如何判断输入的是英文字母_python如何判断一个字符是否为汉字,英文字母,数字,空还是其他...
  2. Lync 2013部署(1)—AD准备
  3. Windows Phone 7 Tips (1)
  4. 003---属性查找和绑定方法
  5. java web博客系统_JavaWeb之博客系统(五)
  6. codeforces 932E Team Work 高等数学求导、dp
  7. 前端学习(1181):vue语法模板
  8. 小白入职AI数据工程师
  9. js 斐波那契数列(兔子问题)
  10. python 路径规划最短距离_路径规划(最短路径)算法C#实现
  11. redis value多大会影响性能_Redis 最常见面试问题
  12. 2021Java面经:史上最全的《Java面试题及解析》
  13. C语言负数的小数次方,c语言 10 负次方
  14. 4k纸是几厘米乘几厘米_几厘米?4k的纸多大?
  15. 卡内基梅隆大学计算机科学博士,美国卡内基梅隆大学博士需要几年
  16. html基础教学ppt,HTML5基础培训ppt课件
  17. 【PCL】NDT点云配准(Registration)
  18. 《从零开始的 RPG 游戏制作教程》第十五期:地图发布,以及再见
  19. [mysql安装教程]解决ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)问题
  20. HTML中利用JS调用PHP (以登录为例)

热门文章

  1. google map flex
  2. 前端日期计算年数_excel-常见日期 、时间函数
  3. html 控制边框长度,如何控制CSS边框长度的示例代码分享
  4. python os库
  5. anaconda如何装python_如何在已安装Python条件下,安装Anaconda,,并将原有Python添加到Anaconda中...
  6. jQuery 配置和基本语法
  7. 第 19 次 CCF CSP 认证 202006-4 1246(digits)
  8. 深度学习之RNN、LSTM、GRU篇
  9. leetcode963. Minimum Area Rectangle II
  10. 使用弹出窗体修改数据,之后返回值