• 声明和定义

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. 移动端 iphone手机在中文情况下不执行keyup事件

    问题:移动端 在

  2. 第七周学习总结&JAVA实验五报告。

    JAVA实验报告五: 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 J ...

  3. python MySQLdb 一个连接connection多个cursor

    使用MySQLdb时,如果创建一个连接connection,多个线程同时使用,会不会有问题? 在下文中,我们将模拟这种场景,看是否会出现问题. 1.示例 1.1 正常的情况 创建一个连接,两个线程同时 ...

  4. TimePicker 时间选择器

    用于选择或输入日期 固定时间点 提供几个固定的时间点供用户选择 使用 el-time-select 标签,分别通过star.end和step指定可选的起始时间.结束时间和步长 <el-time- ...

  5. Selenium 2自动化测试实战7(定位元素)

    一.xpath定位 1. 绝对定位 举例用百度输入框和搜索按钮 eg:find_element_by_xpath("/html/body/div/div[2]/div/div/div/fro ...

  6. mysql登录的三种方式

    1.远程登录mysql 先授权:如:grant all on *.* to 'root'@'192.168.81.130' identified by '52033dd';查看是否生效:select ...

  7. SQLServer 断开指定会话

    方法1: SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [Master].[dbo] ...

  8. 20191209 Linux就该这么学(5)

    5. 用户身份与文件权限 5.1 用户的身份和能力 Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID( User IDentificati ...

  9. Angular5 tslint错误:The selector of the component “XXXComponent” should be used as element

    错误描述 在项目中自己封装了一个 select 组件 @Component({ selector: '[app-choosen-select]', templateUrl: './selectcomm ...

  10. 【Android Apk重新签名报错re-sign.jar之解决方法】

    故障现象: