C++语法:
1 结构体和类的区别
1.1 结构体
1.1.1 怎样定义1个student数据类型
struct student
{
int number;
char name[20];
int age;
}; //不能少;号
注意:student和int是同一级别
1.1.2 怎样定义1个student型变量
student stu1;
1.1.2 怎样给stu1变量赋初值
方法一:
student stu1;
stu1.number=1001;
strcpy(stu1.name,"zhangsan"); //输入参数"zhangsan",本质上代表的是字符'z'的地址
stu1.age=21;
方法二:
student stu1={1001,"zhangsan",21};
代码:
#include
#include
struct student
{
int number;
char name[20];
int age;
};
int main()
{
student stu1;
stu1.number=1001;
strcpy(stu1.name,"zhangsan"); //输入参数"zhangsan",本质上代表的是字符'z'的地址
stu1.age=21;
printf("%d\t%s\t%d\n",stu1.number,stu1.name,stu1.age);
return 0;
}
1.2 类
1.2.1 类与结构体的区别
类的默认访问权限是private
结构体的默认访问权限是public
1.2.2
以后,将class类型的访问权限都设置为public----学习
代码:
#include
#include
class student
{
public:
int number;
char name[20];
int age;
};
int main()
{
student stu1;
stu1.number=1001;
strcpy(stu1.name,"zhangsan");
stu1.age=21;
printf("%d\t%s\t%d\n",stu1.number,stu1.name,stu1.age);
return 0;
}
1.2.3 类的四大成员函数
1.2.3.1 构造函数
注意:定义变量时,自动调用(所以,不需要写函数名)
代码:
#include
#include
class student
{
public:
int number;
char name[20];
int age;
void print();
student();
student(int num,char *nam,int ag);
};
student:: student()
{
number=0;
strcpy(name,"");
age=0;
}
student:: student(int num,char *nam,int ag)
{
number=num;
strcpy(name,nam);
age=ag;
}
void student:: print()
{
printf("%d\t%s\t%d\n",number,name,age);
return;
}
int main()
{
student stu1;
//student stu2(1003,"wangwu",23);
//stu2.print();
stu1.print();
return 0;
}
改进代码:
改进原因:name为数组变量,不好。因为使用strcpy函数时,可能会导致系统崩溃;如果数组设置大了,又浪费空间。
解决办法:使用动态内存分配,即将name设置为地址变量
知识点:
1 new的使用方法
注意:
1 new是运算符,它和+-*/是同一级别
2 new后面直接跟数据类型(四大基本数据类型、类名)
3 数据类型后面跟[]
4 []里面的数组,代表了 几个 单位的内存空间大小。 单位:1、4、8 200
5 真正的内存空间大小是 单位*n
6 一旦分配成功,系统不会自动释放,所以需要我们手动释放-------非常重要
2 delete的使用方法
delete []p;
1.2.3.2析构函数
产生的原因:就是为了使用delete
知识点:
1 局部变量(auto自动变量)和全局变量
尽量使用局部变量来解决问题,因为它是自动的;
万不得已才需要使用动态内存分配。
1.2.3.3 拷贝构造函数---特殊的构造函数
自己的特点:参数是student类型的
代码:
#include
#include
class student
{
public:
int number;
char *name;
int age;
void print();
student();
student(int num,char *nam,int ag);
student(student &other);
~student();
};
student:: student()
{
number=0;
name=new char[1];
strcpy(name,"");
age=0;
}
student:: student(student &other)
{
number=other.number;
name=new char[strlen(other.name)+1];
strcpy(name,other.name);
age=other.age;
}
student:: ~student()
{
printf("开始析构了\n");
delete []name;
}
student:: student(int num,char *nam,int ag)
{
number=num;
name=new char[strlen(nam)+1];
strcpy(name,nam);
age=ag;
}
void student:: print()
{
printf("%d\t%s\t%d\n",number,name,age);
return;
}
int main()
{
student stu1(1001,"zhangsan",21);
student stu2(stu1);
stu2.print();
return 0;
}
1.2.3.4 赋值函数
注意点:
1 不是构造函数
2 等号两边的变量(对象),都已经构造过了
student stu1=stu2;
student stu1(stu2); //实际都调用的是拷贝构造函数
3 等号两边的对象应该属于同一类,如为student类
4 系统默认的赋值函数,几乎不能用,要重写。
知识点:
1 this
为当前对象的地址
赋值函数中要用,而且是对比2个对象是否相等 this==&other
不能用*this==other
2 返回值是为了解决链式传送的问题
stu3=stu2=stu1;
3 重新给name分配内存空间时,不要忘了,要将不用的name释放掉(实际指 原name所指向的内存空间)。
4 不要自己给自己赋值
代码:
#include
#include
class student
{
public:
int number;
char *name;
int age;
void print();
student & operator=(student &other);
student();
student(int num,char *nam,int ag);
student(student &other);
~student();
};
student:: student()
{
number=0;
name=new char[1];
strcpy(name,"");
age=0;
}
student:: student(student &other)
{
number=other.number;
name=new char[strlen(other.name)+1];
strcpy(name,other.name);
age=other.age;
}
student & student:: operator=(student &other)
{
if(this==&other)
return *this;
number=other.number;
char *namebak=name;
name=new char[strlen(other.name)+1];
strcpy(name,other.name);
age=other.age;
delete []namebak;
return *this;
}
student:: ~student()
{
printf("开始析构了\n");
delete []name;
}
student:: student(int num,char *nam,int ag)
{
number=num;
name=new char[strlen(nam)+1];
strcpy(name,nam);
age=ag;
}
void student:: print()
{
printf("%d\t%s\t%d\n",number,name,age);
return;
}
int main()
{
student stu1(1001,"zhangsan",21);
student stu2(1002,"lisi",22);
student stu3(1003,"wangwu",23);
stu3=stu2=stu1;
//stu3.operator=(stu2);
stu3.print();
return 0;
}
知识点:
引用
1 引用的概念
引用就是 别名
int a=10;
int b=a; //内存中有2个10
int a=10;
int &b=a; //内存中有1个10----b和a是一回事
a=20;
b=30;
代码:
#include
#include
void swap(int &m=a,int &n=b) //假想成这样
{
return;
}
int main()
{
int a=10;
int b=20;
swap_etc(a,b);
printf("%d\t%d\n",a,b);
return 0;
}
题目:在student类的四大基本成员函数上,增加1个成员变量chengji(是score类的变量,包含math/english/computer,求和的成员函数)