• 声明和定义

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. Spring之AOP配置

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

  2. Java_IO流实验

    实验题目链接:Java第09次实验(IO流) 0. 字节流与二进制文件 我的代码 package experiment.io; import java.io.DataInputStream; impo ...

  3. openssl-1.0.1u静态库编译

    不管Windows还是linux都是需要安装好perl环境的 Windows步骤 1.解压openssl-1.0.1u.tar.gz 2.使用Vs2005命令行工具进入解压后的目录 3.执行如下命令 ...

  4. HTML技巧:怎样禁止图片拖动复制

    用jQuery实现代码: <script> var imgs=$("img"); imgs.on("contextmenu",function(){ ...

  5. LinuxGPIO中文文档

    本文来自Linux官方文档英文版,由于需要使用Linux的GPIO进行实验,我翻译了这篇文档. 本文档描述了GPIO框架的使用者接口.注意它描述了新的基于描述符的接口. 不推荐使用的基于整数的GPIO ...

  6. WPF prism 类、属性和方法的导入和导出

    学习Prism一定要掌握依赖注入的应用,只有了解了Prism的依赖注入才能更好的使用Prism提升应用开发的架构. 首先说明Prism依赖注入有两种方式及MEF和Unity ,在Prism中是两个没有 ...

  7. 阶段3 2.Spring_08.面向切面编程 AOP_8 spring中的环绕通知

    环绕通知.method属性需要新加一个方法 在logger内中新加aroundPringLog方法 异常代码先注释掉 对比现在的环绕通知和之前写代理类做的环绕通知.右侧的方法内有明确的业务层方法(切入 ...

  8. 安装MySQL Enterprise Monitor

    MySQL Enterprise Monitor是专门为MySQL数据库而设计的一款企业级监控,能非常好地与MySQL各方面特性相结合,包括:MySQL的关键性能指标.主机.磁 盘.备份.新特性相关以 ...

  9. 文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research

    引言 在互联网上随意右击一张图片,都可以发现复制图片地址这个选项,这说明他们都有自己的链接(直链),也就是说我们可以通过一个链接本身来访问图片.代码等文件,而不是打开一个网页再选择复制,这就和下载链接 ...

  10. 【github】git常用命令和node项目

    这是之前在本地搞的一个小东西.因为之前电脑经常会很卡.后来发现任务管理器中多了两个不知名的进程:chromgpu.exe和flrefox.exe 乍一看以为和chrome和firefox两个浏览器有关 ...