• 声明和定义

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. beta week 1/2 Scrum立会报告+燃尽图 03

    本次作业要求参见:edu.cnblogs.com/campus/nenu/2019fall/homework/9913 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名:胜利点 二.S ...

  2. MessageWebSocket

    using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; usi ...

  3. LeetCode 40. 组合总和 II(Combination Sum II)

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能 ...

  4. __doPostBack function

    __doPostBack function Hi everyone. Today I am going to talk about the __doPostBack function, because ...

  5. JSP——JSTL定制标签 - 递归标签显示属性结构

    编写定制标签分为三个步骤:编写标签处理器.配置标签.使用标签. 1.标签处理器 标签处理器和标签是一一对应的关系 package com.oolong.utils.customtags;   impo ...

  6. 引用&指针交换函数实践

    实践如下: #include <iostream> using namespace std; // 普通交换,注意这里的ab值,在具体调用时是基本数据的拷贝,原始数据不会变化 // 因此这 ...

  7. Kotlin概述

    Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发. Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行. JetBrai ...

  8. Color色彩

    Element 为了避免视觉传达差异,使用一套特定的调色板来规定颜色,为你所搭建的产品提供一致的外观视觉感受. ¶主色 Element 主要品牌颜色是鲜艳.友好的蓝色. Blue #409EFF ¶辅 ...

  9. Visual Studio 2017 远程调试

    当你将.NET程序发布到不同机子时候,想要进行调试,但机子不足以安装VS或安装VS麻烦,可以考虑使用远程调试,这里以C#项目为例,asp.net方法略有不同 原理: 首先安装VS远程调试工具,有俩种安 ...

  10. Maven 安装 / 常用配置 / 阿里maven中央仓库

    Maven 官方下载地址: http://maven.apache.org/download.cgi 可以选择清华的镜像: 解压在settings.xml里面配置阿里中央仓库: <mirror& ...