• 声明和定义

1.变量的定义

   变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。

2.变量的声明

   用于向程序表明变量的类型和名字。程序中变量可以声明多次,但只能定义一次。个人理解声明就是只能看不能用。

3.两者联系与区别:

  (1)定义也是声明,因为当定义变量时我们也向程序表明了它的类型和名字;

  (2)但声明不是定义,可以通过使用extern关键字声明变量而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern;

例:

extern int i;//声明但不定义

int i;//声明也定义

extern声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。

注意:如果声明有初始化式,那么它可被当作是定义,此时声明也是定义了,即使声明标记为extern,

例如:extern double pi = 3.1416;//声明也定义,此句话虽然使用了extern,但是这条语句还是定义了pi,分配并初始化了存储空间。

注意:只有当extern声明位于函数外部时,才可以含有初始化式。

注意:因为初始化的extern声明已经是定义了,而变量在程序中只能定义一次,所以对该变量随后的任何定义都是错误的:

extern double pi = 3.1416;//定义了

double pi;//重定义,不合法

注意:在C++语言中,变量必须仅能定义一次,而且在使用变量之前必须定义或声明变量。

4.为什么需要区分声明和定义:

C++程序通常由许多文件组成。为了让多个文件访问相同的变量,C++区分了声明和定义。任何在多个文件中使用的变量都需要既有定义又有声明。在这种情况下,在一个文件中定义了变量,在其他使用改变了的文件中则只能包含变量的声明(不能再包含定义,因为变量只能定义一次)。

  • 实例

通过类的继承实现不同角色的权限控制。权限:博士生>研究生>本科生,本科生只能访问关于本科的课程信息,研究生可以访问研究生和本科的课程信息,博士生可以访问博士、研究生和本科的课程信息。

#include<iostream>
#include<string>
#include"student.h"
#include"teacher.h" using namespace std; class System{
protected:
  //这里只是声明,没有定义
static Student students1[100];
static Teacher teachers1[100];
static int s1;
static int t1;
static Student students2[100];
static Teacher teachers2[100];
static int s2;
static int t2;
static Student students3[100];
static Teacher teachers3[100];
static int s3;
static int t3;
};
class StudentSystem1 :virtual public System{
public:
virtual void registe(string, string, string, string);
void display1();
virtual void menu();
virtual bool search(string, string);
}; class StudentSystem2 :virtual public StudentSystem1{
public:
virtual void registe(string, string, string, string);
void display2();
virtual void menu();
virtual bool search(string, string);
}; class StudentSystem3 :virtual public StudentSystem2{
public:
virtual void registe(string, string, string, string);
void display3();
void menu();
bool search(string, string);
};
#include"studentsystem.h"

Student System::students1[100];
Teacher System::teachers1[100];
int System::s1;
int System::t1;
Student System::students2[100];
Teacher System::teachers2[100];
int System::s2;
int System::t2;
Student System::students3[100];
Teacher System::teachers3[100];
int System::s3;
int System::t3; bool StudentSystem1::search(string nu,string p){
for (int i = ; i < s1; i++){
if (students1[i].getNumber()==nu&&students1[i].getPassword() == p)
return true;
}
return false;
}
bool StudentSystem2::search(string nu, string p){
for (int i = ; i < s2; i++){
if (students2[i].getNumber() == nu&&students2[i].getPassword() == p)
return true;
}
return false;
}
bool StudentSystem3::search(string nu, string p){
for (int i = ; i < s3; i++){
if (students3[i].getNumber() == nu&&students3[i].getPassword() == p)
return true;
}
return false;
} void StudentSystem1::registe(string number, string password, string name, string room){
Student stu(number, password, name, room);
students1[s1] = stu;
s1++;
cout << "注册成功" << endl;
}
void StudentSystem2::registe(string number, string password, string name, string room){
Student stu(number, password, name, room);
students2[s2] = stu;
s2++;
cout << "注册成功" << endl;
}
void StudentSystem3::registe(string number, string password, string name, string room){
Student stu(number, password, name, room);
students3[s3] = stu;
s3++;
cout << "注册成功" << endl;
} void StudentSystem1::display1(){
cout << "本科:"<<endl;
for (int i = ; i < t1; i++){
teachers1[i].display();
}
system("pause");
system("cls");
}
void StudentSystem2::display2(){
cout << "研究生:" << endl;
for (int i = ; i < t2; i++){
teachers2[i].display();
}
system("pause");
system("cls");
}
void StudentSystem3::display3(){
cout << "博士生:" << endl;
for (int i = ; i < t3; i++){
teachers3[i].display();
}
system("pause");
system("cls");
} void StudentSystem1::menu(){
char opt = ' ';
while (opt != ''){
cout << "--------------------" << endl;
cout << "1 查看课程信息" << endl;
cout << "2 返回" << endl;
cout << "--------------------" << endl;
cin >> opt;
switch (opt)
{
case '':
display1(); break;
case '':
break;
default:
cout << "输入错误" << endl;
system("pause");
system("cls");
break;
} }
}
void StudentSystem2::menu(){
char opt = ' ';
while (opt != ''){
cout << "--------------------" << endl;
cout << "1 查看本科课程信息" << endl;
cout << "2 查看研究生课程信息" << endl;
cout << "3 注销" << endl;
cout << "--------------------" << endl;
cin >> opt;
switch (opt)
{
case '':
display1();
break;
case '':
display2();
break;
case '':
break;
default:
cout << "输入错误" << endl;
system("pause");
system("cls");
break;
} }
}
void StudentSystem3::menu(){
char opt = ' ';
while (opt != ''){
cout << "--------------------" << endl;
cout << "1 查看本科课程信息" << endl;
cout << "2 查看研究生课程信息" << endl;
cout << "3 查看博士生课程信息" << endl;
cout << "4 注销" << endl;
cout << "--------------------" << endl;
cin >> opt;
switch (opt)
{
case '':
display1(); break;
case '':
display2(); break; case '':
display3(); break;
case '':
break;
default:
cout << "输入错误" << endl;
system("pause");
system("cls");
break;
} }
}

C++有静态成员变量的类继承的更多相关文章

  1. C++ static静态成员变量在类中仅仅是声明

    今天写代码时看到: 图1的3个静态成员变量在类中仅仅是声明,没有定义以及分配内存:必须在类外,图中就是cpp中,定义分配内存,才能使用

  2. C++类的静态成员变量与静态成员函数

    1.类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间. 3.静态成员变量通过类名访 ...

  3. C++类的静态成员变量初始化 Win32 API 定时器使用

    1.类的静态成员变量 .h 类声明入下 class A { public: static int x; }; .cpp文件 这样初始化. ; 2.定时器使用 1.SetTimer(HWND,UINT, ...

  4. c++,static 静态成员变量 / 静态成员函数

    静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...

  5. Java学习笔记8---类的静态成员变量与静态成员方法的访问与调用方式

    (注:静态变量修改为静态成员变量,静态方法改为静态成员方法) 静态成员变量又称类变量,静态成员方法又称类方法,它们统称为静态成员或类成员.静态成员由static修饰,是属于整个类的,所有的对象共享这些 ...

  6. C++之类静态成员变量和静态成员函数

    1.静态成员变量必须在类外初始化 2.静态成员变量在类中不占内存字节: 3.静态成员变量,被所有的类对象共 享 class G {public: static int a; //静态成员变量 int ...

  7. C++静态成员变量必须定义

    静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存,否则不能使用,编译不会通过. class A { public: static int a; //声明但未 ...

  8. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

  9. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

随机推荐

  1. crossdomain.xml解决跨域问题

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  2. vultr云主机充10美元送50美元

    目录 注册地址: 如何收费? 停止状态的实例是否收费? 有哪些支付方式? 提供哪些操作系统? 注册地址: https://www.vultr.com/?ref=8199131 如何收费? 按小时计费, ...

  3. docker 安装kafka(快速)

    下载镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 启动镜像 docker run -d --name zoo ...

  4. layui学习地址

    --layui学习地址 ,相当之好用,非常感谢为我们工作和学习提供方便的才子们,谢谢~https://www.layui.com/demo/layim.html

  5. 统计学_F分布(图文详解和python脚本实现)

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...

  6. iOS 的 Gif 渲染

    关于gif的展示,有些项目中很少用到,所以有的人对于这方面了解不是很多 下面介绍几种展示gif的方法,希望大家可以用得上,有更好的方法欢迎评论区留言 一,展示本地的gif,使用的SDWebImage里 ...

  7. 解决 Ubuntu 18.10 使用较新的独立显卡输出无法初始化图形界面并配置深度学习开发环境

    原文地址:解决 Ubuntu 18.10 使用较新的独立显卡输出无法初始化图形界面并配置深度学习开发环境 0x00 配置 硬件 OS: Ubuntu 18.10 Base Board: ASUS WS ...

  8. 介绍一下 NDK?

    1.NDK 是一系列工具的集合 NDK 提供了一系列的工具,帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 apk.NDK 集成了交叉编译器,并提供了相应 ...

  9. docker rm & docker rmi & docker prune 的差异

    docker rm & docker rmi & docker prune 的差异 docker rm : 删除一个或多个 容器 docker rmi :  删除一个或多个 镜像 do ...

  10. Python实现利用最大公约数求三个正整数的最小公倍数示例

    Python实现利用最大公约数求三个正整数的最小公倍数示例 本文实例讲述了Python实现利用最大公约数求三个正整数的最小公倍数.分享给大家供大家参考,具体如下: 在求解两个数的小公倍数的方法时,假设 ...