cin>>s->score[0]>>s->score[1]>>s->score[2];
// return 0;
}
//保存
void add(const student*s)
{
data[count]=*s;
count++;
// return 0;
}
//打印出来
void listall()
{
cout<<"---------------------------------"<cout<<"编号"<<"\t"<<"姓名"<<"\t"<<"语文"<<"数学"<<"英语"<for(int i=0;i{
student*s=&data[i];
cout<id<<"\t"<name<<"\t"<score[0]<<"\t"<score[1]<<"\t"<score[2]<}
cout<<"---------------------------------"<}
void showmenu()
{
cout<<"主菜单"<cout<<"1、输入文件2、计数"<cout<<"3、显示文件4、退出"<}
//
void select()
{
int select;
student s;
cout<<"请输入菜单对应的数字:"<cin>>select;
switch (select)
{
case 1: input(&s);
add(&s);
break;
case 2:cout<<"共输入了"<break;
case 3:listall();
break;
case 4: break;
default:cout<<"输入错误!请重新输入!"<}
}
int main()
{
student s;
while(1)
{
showmenu();
select();
}
return 0;
}
//链表的应用
#include
//结构
struct student
{
int id;
char name[16];
student*next;
};
//定义全局变量
student ss[3]=
{
{20171101,"liu"},
{20171102,"hua"},
{20171103,"zheng"}
};
// 寻找id
student *find(student*head,int id) {
student*p=head;
while(p)
{
if(p->id==id)
return p;
p=p->next;
}
return NULL;
}
int main()
{ //链表的构造
ss[0].next=&ss[1];
ss[1].next=&ss[2];
ss[2].next=0;
//链表的遍历
student *resech=find(&ss[0],20171101);
cout<id<<"\t"<name<return 0;
}
//内联函数的定义
#include
using namespace std;
//内联函数,交换两个数的值
inline void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(){
int m, n;
cin>>m>>n;
cout<swap(&m, &n);
cout<return 0;
}
//类与对象的使用
#include
using namespace std;
//类通常定义在函数外面
class Student{
public:
//类包含的变量
char *name;
int age;
float score;
//类包含的函数
void say(){
cout<};
int main(){
//创建对象
Student stu;
https://www.wendangku.net/doc/9f4838252.html, = "小明";
stu.age = 15;
stu.score = 92.5f;
stu.say();
return 0;
}
#include
using namespace std;
class Student{
public:
char *name;
int age;
float score;
void say(){
cout<}
};
int main(){
Student *pStu = new Student;
pStu -> name = "小明";
pStu -> age = 15;
pStu -> score = 92.5f;
pStu -> say();
delete pStu; //删除对象
return 0;
}
这段代码在类体中定义了成员函数。你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示:
class Student{
public:
//成员变量
char *name;
int age;
float score;
//成员函数
void say(); //函数声明
};
//函数定义
void Student::say(){
cout<}
在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。
称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。成员函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前。
内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以我建议在类体内部对成员函数作声明,而在类体外部进行定义,这是一种良好的编程习惯,实际开发中大家也是这样做的。
当然,如果你的函数比较短小,希望定义为内联函数,那也没有什么不妥的。
class Student{
public:
char *name;
int age;
float score;
void say(); //内联函数声明,可以增加 inline 关键字,但编译器会忽略
};
//函数定义
inline void Student::say(){
cout<}
C++通过public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。
#include
using namespace std;
//类的声明
class Student{
private: //私有的
char *m_name;
int m_age;
float m_score;
public: //共有的
void setname(char *name);
void setage(int age);
void setscore(float score);
void show();
};
//成员函数的定义
void Student::setname(char *name){
m_name = name;
}
void Student::setage(int age){
m_age = age;
}
void Student::setscore(float score){
m_score = score;
}
void Student::show(){
cout<}
int main(){
//在栈上创建对象
Student stu;
stu.setname("小明");
stu.setage(15);
stu.setscore(92.5f);
stu.show();
//在堆上创建对象
Student *pstu = new Student;
pstu -> setname("李华");
pstu -> setage(16);
pstu -> setscore(96);
pstu -> show();
return 0;
}
一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。
构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。
#include
using namespace std;
class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
Student(char *name, int age, float score);
void show();
};
//采用参数初始化表
Student::Student(char *name, int age, float score): m_name(name),
m_age(age), m_score(score){
//TODO:
}
void Student::show(){
cout<}
int main(){
Student stu("小明", 15, 92.5f);
stu.show();
Student *pstu = new Student("李华", 16, 96);
pstu -> show();
return 0;
}
//构造函数
构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。
#include
using namespace std;
class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
Student(char *name, int age, float score);
void show();
};
//采用参数初始化表
Student::Student(char *name, int age, float score): m_name(name),
m_age(age), m_score(score){
//TODO:
}
void Student::show(){
cout<}
int main(){
Student stu("小明", 15, 92.5f);
stu.show();
Student *pstu = new Student("李华", 16, 96);
pstu -> show();
}
运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是96
如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然
使用参数初始化表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简明明了。
注意,参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。请看代码:
#include
using namespace std;
class Demo{
private:
int m_a;
int m_b;
public:
Demo(int b);
void show();
};
Demo::Demo(int b): m_b(b), m_a(m_b){ }
void Demo::show(){ cout<int main(){
Demo obj(100);
obj.show();
}
运行结果:
2130567168, 100
在参数初始化表中,我们将m_b 放在了m_a 的前面,看起来是先给m_b 赋值,再给m_a 赋值,其实不然!成员变量的赋值顺序由它们在类中的声明顺序决定,在Demo 类中,我们先声明的m_a,再声明的m_b,
初始化const 成员变量
参数初始化表还有一个很重要的作用,那就是初始化const 成员变量。初始化const 成员变量的唯一方法就是使用参数初始化表。例如VS/VC 不支持变长数组(数组长度不能是变量),我们自己定义了一个VLA 类,用于模拟变长数组,请看下面的代码:
class VLA{
private:
const int m_len;
int *m_arr;
public:
VLA(int len);
};
//必须使用参数初始化表来初始化 m_len
VLA::VLA(int len): m_len(len){
m_arr = new int[len];
}
//析构函数
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。
析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构
注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。
上节我们定义了一个VLA 类来模拟变长数组,它使用一个构造函数为数组分配内存,这些内存在数组被销毁后不会自动释放,所以非常有必要再添加一个析构函数,专门用来释放已经分配的内存。请看下面的完整示例:
#include
using namespace std;
class VLA{
public:
VLA(int len); //构造函数
~VLA(); //析构函数
public:
void input(); //从控制台输入数组元素
void show(); //显示数组元素
private:
int *at(int i); //获取第i个元素的指针
private:
const int m_len; //数组长度
int *m_arr; //数组指针
int *m_p; //指向数组第i个元素的指针
};
VLA::VLA(int len): m_len(len){
if(len > 0){ m_arr = new int[len]; /*分配内存*/ }
else{ m_arr = NULL; }
}
VLA::~VLA(){
delete[] m_arr; //释放内存
}
void VLA::input(){
for(int i=0; m_p=at(i); i++){ cin>>*at(i); }
}
void VLA::show(){
for(int i=0; m_p=at(i); i++){
if(i == m_len - 1){ cout<<*at(i)<else{ cout<<*at(i)<<", "; }
}
}
int * VLA::at(int i){
if(!m_arr || i<0 || i>=m_len){ return NULL; }
else{ return m_arr + i; }
}
int main(){
//创建一个有n个元素的数组(对象)
int n;
cout<<"Input array length: ";
cin>>n;
VLA *parr = new VLA(n);
//输入数组元素
cout<<"Input "<parr -> input();
//输出数组元素
cout<<"Elements: ";
parr -> show();
//删除数组(对象)
delete parr;
return 0;
}
this 是C++ 中的一个关键字,也是一个const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。
下面是使用this 的一个完整示例:
#include
using namespace std;
class Student{
public:
void setname(char *name);
void setage(int age);
void setscore(float score);
void show();
private:
char *name;
int age;
float score;
};
void Student::setname(char *name){
this->name = name;
}
void Student::setage(int age){
this->age = age;
}
void Student::setscore(float score){
this->score = score;
}
void Student::show(){
cout<name<<"的年龄是"<age<<",成绩是"<score<}
int main(){
Student *pstu = new Student;
pstu -> setname("李华");
pstu -> setage(16);
pstu -> setscore(96.5);
pstu -> show();
return 0;
}