静态成员函数一般情况下只能访问静态成员变量

合集下载

c++的static关键字用法

c++的static关键字用法

c++的static关键字用法C++中的`static`关键字有多种用法,在不同的场景下都有着不同的含义和作用。

本文将详细介绍C++中`static`关键字的用法及其相关特性,希望能对读者更好地理解和运用这个关键字。

一、`static`关键字概述`static`是C++中的一个关键字,它常用于指定函数、变量、类成员等的作用域和生命周期。

它的主要作用如下:1. 限定变量的作用域。

使用`static`关键字声明的变量具有静态的生存期和块作用域,即在整个程序运行期间都存在,并且只能在声明变量的源文件中访问。

2. 限定函数的作用域。

使用`static`关键字声明的函数具有静态的作用域,即只能在声明它的源文件中调用。

3. 限定类成员的作用域。

使用`static`关键字声明的类成员为静态成员,它不属于类的任何一个对象,而是属于整个类,可以通过类名或类对象来访问。

4. 防止符号重定义。

当在多个源文件中定义同名的全局变量或函数时,使用`static`关键字可以防止它们之间的符号重定义错误。

二、静态变量1. 全局静态变量使用`static`关键字声明的全局变量具有静态生存期和文件作用域,即它在程序运行期间一直存在,而且只能在声明它的源文件中访问。

例如:```cpp//file1.cpp#include <iostream>static int count = 10; //声明全局静态变量countvoid func() {static int i = 5; //局部静态变量i,生命周期为整个程序运行期间std::cout << "i is " << i ;std::cout << " and count is " << count << std::endl;i++;count++;}```在另一个源文件中引用这个全局静态变量,编译器会报错:```cpp//file2.cpp#include <iostream>extern int count; //声明全局变量countvoid func2() {std::cout << "count is " << count << std::endl;}```编译器会报错:undefined reference to `count'。

2024年6月GESP编程能力认证C++等级考试六级真题(含答案)

2024年6月GESP编程能力认证C++等级考试六级真题(含答案)

2024年6月GESP编程能力认证C++等级考试六级真题(含答案) 一、单选题(每题2分,共30分)。

1.面向对象的编程思想主要包括()原则。

A. 贪心、动态规划、回溯。

B. 并发、并行、异步。

C. 递归、循环、分治。

D. 封装、继.承、多态。

2.运行下列代码,屏幕上输出()。

A. 1 1 1B. 1 2 3C. 1 1 2D. 1 2 23.运行下列代码,屏幕上输出()。

A. rectangle area: triangle area:B. parent class area: parent class area:C. 运行时报错D. 编译时报错4.向一个栈顶为hs的链式栈中插入一个指针为s的结点时,应执行()。

A. hs->next =s;B. s->next =hs;hs =s;C. s->next =hs->next;hs->next =s;D. s->next =hs;hs =hs->next;5.在栈数据结构中,元素的添加和删除是按照什么原则进行的()。

A. 先进先出B. 先进后出C. 最小值先出D. 随机顺序6.要实现将一个输入的十进制正整数转化为二进制表示,下面横线上应填入的代码为()。

7.下面定义了一个循环队列的类,请补全判断队列是否满的函数,横向上应填写()。

A. return(rear +1)% capacity ==front;B. return rear % capacity ==front;C. return rear ==front;D. return(rear +1)==front;8.对“classmycls”使用哈夫曼(Huffman)编码,最少需要()比特。

A. 10B. 20C. 25D. 309.二叉树的()第一个访问的节点是根节点。

A. 先序遍历B. 中序遍历C. 后序遍历D. 以上都是10.一棵5层的满二叉树中节点数为()。

C++面试问答100道

C++面试问答100道

C++经典⾯试题100例及答案1. ⾯向对象的程序设计思想是什么?答:把数据结构和对数据结构进⾯操作的⾯法封装形成⾯个个的对象。

2. 什么是类?答:把⾯些具有共性的对象归类后形成⾯个集合,也就是所谓的类。

3. 对象都具有的两⾯⾯特征是什么?分别是什么含义?答:对象都具有的特征是:静态特征和动态特征。

静态特征是指能描述对象的⾯些属性(成员变量),动态特征是指对象表现出来的⾯为(成员函数)4. 在头⾯件中进⾯类的声明,在对应的实现⾯件中进⾯类的定义有什么意义?答:这样可以提⾯编译效率,因为分开的话只需要编译⾯次⾯成对应的.obj⾯件后,再次应⾯该类的地⾯,这个类就不会被再次编译,从⾯⾯⾯的提⾯了编译效率。

5. 在类的内部定义成员函数的函数体,这种函数会具备那种属性?答:这种函数会⾯动为内联函数,这种函数在函数调⾯的地⾯在编译阶段都会进⾯代码替换。

6. 成员函数通过什么来区分不同对象的成员数据?为什么它能够区分?答:通过this指针指向对象的⾯地址来区分的。

7. C++编译器⾯动为类产⾯的四个缺省函数是什么?答:默认构造函数,拷贝构造函数,析构函数,赋值函数。

8. 拷贝构造函数在哪⾯种情况下会被调⾯?答:1.当类的⾯个对象去初始化该类的另⾯个对象时;2.如果函数的形参是类的对象,调⾯函数进⾯形参和实参结合时;3.如果函数的返回值是类对象,函数调⾯完成返回时。

9.构造函数与普通函数相⾯在形式上有什么不同?答:1.构造函数是类的⾯种特殊成员函数,⾯般情况下,它是专门⾯来初始化对象成员变量的。

2.构造函数的名字必须与类名相同,它不具有任何类型,不返回任何值。

10. 什么时候必须重写拷贝构造函数?答:当构造函数涉及到动态存储分配空间时,要⾯⾯写拷贝构造函数,并且要深拷贝。

11. 构造函数的调⾯顺序是什么?答:1.先调⾯基类构造函数2.按声明顺序初始化数据成员3.最后调⾯⾯⾯的构造函数。

12. 哪⾯种情况必须⾯到初始化成员列表?答:1.类的成员是常量成员初始化;2.类的成员是对象成员初始化,⾯该对象没有⾯参构造函数。

static 用法

static 用法

static 用法static 用法1. static 变量•定义:在函数内部使用 static 关键字声明的变量称为静态变量。

•特点:–静态变量的生命周期在整个程序运行期间都存在,而不仅仅在函数调用时才存在。

–静态变量存储在静态存储区,不会在函数调用结束后释放内存。

•使用场景:–如果一个变量需要在多次函数调用之间保持其值不变,可以使用静态变量。

–静态变量通常用于计数器或者保存函数的返回值等场景。

•示例代码:#include <>int count() {static int counter = 0;counter++;return counter;}int main() {printf("%d\n", count()); // 输出1printf("%d\n", count()); // 输出2printf("%d\n", count()); // 输出3return 0;}2. static 函数•定义:在函数返回类型前面加上 static 关键字,使函数变为静态函数。

•特点:–静态函数只能在声明它的源文件内部调用,不能被其他源文件使用。

–静态函数不能被其他源文件中的函数调用,从而起到了隐藏的作用。

•使用场景:–当某个函数只在当前源文件内部使用时,可以将其声明为静态函数,以减少命名冲突和提高代码的模块化程度。

•示例代码:#include <>static int multiply(int a, int b) {return a * b;}int main() {int result = multiply(2, 3);printf("%d\n", result); // 输出6return 0;}3. static 类成员•定义:在类中声明的 static 成员属于类本身,而不是类的实例。

•特点:–所有的对象共享同一个静态成员,即静态成员对于所有的对象来说只有一份拷贝。

const用法介绍

const用法介绍

const,extern,static,volatile的使用 (1)Const 深度解析 (3)const用法详解 (7)const,extern,static,volatile的使用1.const的用法:为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。

const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)用法1:常量取代了C中的宏定义,声明时必须进行初始化。

const限制了常量的使用方式,并没有描述常量应该如何分配。

如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。

最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。

―《C++ Program Language》用const声明的变量虽然增加了分配空间,但是可以保证类型安全。

C标准中,const定义的常量是全局的,C++中视声明位置而定。

用法2:指针和常量使用指针时涉及到两个对象:该指针本身和被它所指的对象。

将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。

要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。

所以出现在 * 之前的const是作为基础类型的一部分:char *const cp; //到char的const指针char const *pc1; //到const char的指针const char *pc2; //到const char的指针(后两个声明是等同的)从右向左读的记忆方式:cp is a const pointer to char.pc2 is a pointer to const char.用法3:const修饰函数传入参数将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。

同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。

最新版C++程序设计语言(第2次)作业(含答案)

最新版C++程序设计语言(第2次)作业(含答案)

第2次作业一、单项选择题(本大题共50分,共 20 小题,每小题 2.5 分)1. 类A从类B派生而来,下面()可以在类A的构造函数中调用基类B的构造函数A.class A : public B {public: A(int i){B(i)};}B.class A : public B {public: A(int i):B(i){};}C.class A : public B {public: A(int i):B(int i){};}D.class A : public B {public: A(int i){B(int i)};}2. C++的函数有函数头和函数体两部分组成,下面所列的函数头书写格式中不正确的是()。

A. main(int a,int b)B. main(int a,int b=1)C. main(int a=0,int b)D. main(int a=2,int b=3)3. 下列存取控制符中,()能够限定类外代码不能访问被它修饰的成员。

A.privateB.publicC.protectedD.private和protected都可以4. 下列()能够正确地申明友元函数,让函数fun能够访问类A的私有成员。

A.void fun() friend class A;B.Friend class A{private: int i; void fun();};C.class A{private: int i; friend fun();};D.class A{private: int i; friend void fun();};5. 类A的定义代码如下: class A{ public: A(int i){this->i=i;}setI(int i){this->i=i;} private: int i; }; 下列代码中,()能够正确申明类A的常对象,并给i成员赋初值。

C++自测题

C++自测题

一. 选择(共50题,共1分)1. 下列关于类和对象的叙述中,错误的是( )A.一个类只能有一个对象B.对象是类的具体实例C.类是对某一类对象的抽象D.类和对象的关系是一种数据类型与变量的关系2. 当将一个类A或函数f()说明为另一个类B的友元后,类A或函数f()能够直接访问类B的( )。

A.只能是公有成员B.只能是保护成员C.只能是除私有成员之外的任何成员D.任何权限的成员3. 类中定义的成员默认为( )访问属性。

A.publicB.privateC.protectedD.friend4. 一个类的友元不是该类的成员,与该类的关系密切,所以它(D )。

A.有this指针,有默认操作的对象B.没有this指针,可以有默认操作的对象C.有this指针,不能执行默认操作D.没有this指针,也就没有默认操作的对象5. 假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为( )。

A.x.aB.x.a()C.x->GetValue()D.x.GetValue()6. 对于任一个类,用户所能定义的构造函数的个数至多为( )。

A.0B.1C.2D.任意个7. 一个类的析构函数通常被定义为该类的( )成员。

A.私有B.保护C.公用D.友元8. 有如下类声明:class Foo {int bar; };则Foo类的成员bar 是()A.公有数据成员B.公有成员函数C.私有数据成员D.私有成员函数9. 关于封装,下列说法中不正确的是( )。

A.通过封装,对象的全部属性和操作结合在一起,形成一个整体B.通过封装,一个对象的实现细节被尽可能地隐藏起来(不可见)C.通过封装,每个对象都成为相对独立的实体D.通过封装,对象的属性都是不可见的10. 假定AB为一个类,则执行“AB *s=new AB(a,5);”语句时得到的一个动态对象为( )。

Java语言程序设计(专升本)_B

Java语言程序设计(专升本)_B

Java语言程序设计(专升本)_B2010 —2011学年第二学期考试试卷考试课程: Java 语言程序设计试卷类别:A 卷□ B 卷 C 卷□ 考试形式:闭卷开卷□ 适用专业年级: 10软件工程(专升本)班级姓名学号题号一二三四总分得分一、单选题,下列试题每题只有一个正确的选项,请把正确的选项,填写到答题纸上。

总共25小题,每小题2分,共50分。

得分 1、下面哪个关键字,使类不能在被其他的类继承?A) static B) finally C) final D) instance 2、程序如下:class Test { public static void main(String[] args) { int i=1000; for(;;) { if(i>999) { _______________ } } } }装订线下面对程序的横线处填写不同语句的分析正确的是:A) 填充break 使程序能够有退出循环的可能性。

B) 填充continue 将使程序成为死循环,永远无法退出循环。

C) 填充continue 使程序能够有退出循环的可能性。

D) 填充break 将使程序成为死循环,永远无法退出循环。

3、下面关于抽象类描述错误的是:A) 抽象类的关键字是abstract,在抽象类中可以定义变量和方法。

B) 抽象类中的方法如果可以有实现体,如果没有实现体,则该方法叫做抽象方法必须加关键字abstract修饰该方法。

C) 抽象类中至少需要有一个方法被定义为抽象方法,在该方法前加abstract,把该方法定义为抽象方法。

D) 抽象类中可以没有抽象方法,即所有的方法全部都有实现体。

但是依旧不能为抽象类定义对象。

4、下面关于重载描述错误的是:A) 重载方法的返回值必须相同。

B) 重载方法的参数必须有不同之处。

C) 重载方法的名字必须相同,否则就不能称为重载了。

D) 重载方法的返回类型相不相同都可以。

5、程序如下:class Test{private int day;private int month;public String getDate(){return day+"/"+month;}}class Test2{public static void main(String[] args){Test test=new Test();test.day=25;System.out.println(test.getDate());}共9页第2 页}有关类的描述正确的是:A) 程序在编译时将出错。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

静态成员函数一般情况下只能访问静态成员变量,因为不接受隐含的this指针。

另外作为类的静态成员函数,不用声明对象,便可直接调用,例如类A的静态成员函数fun(); A::fun();
1、主要用于封装全局变量和全局函数。

以避免在文件作用域内包含带外部连接的数据。

例如全局变量:int path;int para1;
解决办法:设计一个全局类,并将这些全局名称声明为静态变量,并编写静态函数来调用这些变量。

class Global{
static int s_path;
static int s_para;
private:
Global();//不实现,避免无意中的实例化
public:
//manipulators
static void setPath(int path){s_path = path;}
static void setPara(int para){s_para = para;}
//accessors
static int getPath(){return s_path;}
static int getPara(){return s_para;}
}
2、对自由函数的封装
在.h文件的文件作用域内避免使用自由函数(运算符函数除外);在.c文件中避免使用带有外部连接的自由函数,因此可以使用静态成员函数进行处理。

例如:int getPara();int getPath();我们可以通过声明一个结构的静态方法代替:
struct SysUtil{
static int getPath();
static int getPara();
}这样,唯一有冲突危险的就是出现类名SysUtil了。

前言:
本文只是本人对C++中关于静态类型的一个总结,如错误之处,请大家帮我改正。

我分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。

一、在面向过程设计中的static关键字
1、静态全局变量
定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。

特点:
A、该变量在全局数据区分配内存。

B、初始化:如果不显式初始化,那么将被隐式初始化为0。

C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。

例(摘于C++程序设计教程---钱能主编P103)://file1.cpp
#include<iostream.h>
void fn();
extern int n;
void main()
{
n=20;
cout << n << endl;
fn();
}
//file2.cpp
#include<iostream.h>
static int n; //定义静态全局变量,初始化为0;
void fn()
{
n++;
cout << n << endl;
}
文件分别编译能通过,但连接时file1.cpp 中的变量n找不到定义,产生连接错误。

D、文件作用域下声明的const的常量默认为static存储类型。

2、静态局部变量
定义:在局部变量前加上static关键字时,就定义了静态局部变量。

特点:
A、该变量在全局数据区分配内存。

B、初始化:如果不显式初始化,那么将被隐式初始化为0。

C、它始终驻留在全局数据区,直到程序运行结束。

但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

3、静态函数(注意与类的静态成员函数区别)
定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。

特点:
A、静态函数只能在本源文件中使用(这是与普通函数区别)
例(摘于C++程序设计教程---钱能主编P103)://file1.cpp
void fn();
void staticFn()
void main()
{
fn();
staticFn();
}
//file2.cpp
#include<iostream.h>
static void staticFn();
void fn();
void fn()
{
staticFn();
cout << "this is fn() \n";
}
void staticFn()
{
cout << "this is staticFn() \n";
}
连接时,将产生找不到函数staticFn()定义的错误。

B、主意事项
在文件作用域下声明的inline函数默认为static类型。

二、面象对象中的static关键字(主要指类中的static关键字)
1、静态数据成员
特点:
A、内存分配:在程序的全局数据区分配。

B、初始化和定义:
a、静态数据成员定义时要分配空间,所以不能在类声明中定义。

b、为了避免在多个使用该类的源文件中,对其重复定义,所在,不能在类的头文件中
定义。

c、静态数据成员因为程序一开始运行就必需存在,所以其初始化的最佳位置在类的内部实现。

C、特点
a、对相于public,protected,private 关键字的影响它和普通数据成员一样,
b、因为其空间在全局数据区分配,属于所有本类的对象共享,所以,它不属于特定的类对象,在没产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。

D、访问形式
a、类对象名.静态数据成员名
b、类类型名:: 静态数据成员名
E、静态数据成员,主要用在类的所有实例都拥有的属性上。

比如,对于一个存款类,帐号相对于每个实例都是不同的,但每个实例的利息是相同的。

所以,应该把利息设为存款类的静态数据成员。

这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内存,所以节省存贮空间。

第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了,因为它们实际上是共用一个东西。

2、静态成员函数
特点:
A、静态成员函数与类相联系,不与类的对象相联系。

B、静态成员函数不能访问非静态数据成员。

原因很简单,非静态数据成员属于特定的类实例。

作用:
主要用于对静态数据成员的操作。

调用形式:
A、类对象名.静态成员函数名()
B、类类型名:: 静态成员函数名()。

相关文档
最新文档