一 : C语言中的结构体
(1) C语言中的结构体不能为空,否则会报错
要求一个结构或联合至少有一个成员
(2) C语言中的结构体只涉及到数据结构,而不涉及到算法.
也就是说在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。
不过虽然C语言的结构体中不能定义成员函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针,所以总的来说C语言中的结构体只是一个复杂数据类型 ,只能定义成员变量,不能定义成员函数,不能用于面向对象编程。来看一个函数指针的例子:
int FuncAdd(int a, int b) //求和
{
return a + b;
}
struct CTest1
{
int(*Add)(int, int); //函数指针
};
int main()
{
struct CTest1 test;
int AddResult = 0;
test.Add = My_FuncAdd;
AddResult = test.Add(8, 6);
printf("%d", AddResult);
}
二 : C++语言中的结构体
(1)第一种语法表示
struct 结构体名称{
数据类型 member1;
数据类型 member2;
};
这种方式在声明结构体变量时为:struct 结构体名称 结构体变量名
#include<stdio.h>
struct Student{
int sNo;
char name[10];
};
int main(){
struct Student stu;
scanf("%d",&stu.sNo);
scanf("%s",stu.name);
printf("%d\n",stu.sNo);
}
(2)第二种语法表示
typedef struct 结构体名称{
数据类型 member1;
数据类型 member2;
}结构体名称别名;
这种方式在声明结构体变量时有两种方式。
第一种:struct 结构体名称 构体变量名
第二种:结构体名称别名 结构体变量名
原因:这里使用了typedef关键字,此关键字的作用就是声明数据类型的别名,方便用户编程,所以这里用了之后,结构体名称别名就相当于struct 结构体名称。在声明结构体变量时,就无需写struct了。
#include<stdio.h>
typedef struct Student{
int sNo;
char name[10];
}Stu;
int main(){
struct Student stu; //方式一
Stu stu1; //方式二
scanf("%d",&stu.sNo);
scanf("%s",stu.name);
printf("%d\n",stu.sNo);
scanf("%d",&stu1.sNo);
scanf("%s",stu1.name);
printf("%d\n",stu1.sNo);
}
(3)第三种方式
struct 结构体名称{
数据类型 member1;
数据类型 member2;
}结构体变量名;
相当于:
struct 结构体名称{
数据类型 member1;
数据类型 member2;
};
struct 结构体名称 结构体变量名;
这种方式既定义了结构体名称,同时声明了一个结构体变量名。在其它地方也可以通过struct 结构体来再次声明其它变量,而第四种方法则不可以。
#include<stdio.h>
struct Student{
int sNo;
char name[10];
}stu; //此处stu 是变量名
int main(){
scanf("%d",&stu.sNo);
scanf("%s",stu.name);
printf("%d\n",stu.sNo);
}
(4)第四种方式
struct {
数据类型 member1;
数据类型 member2;
}结构体变量名;
此方式是匿名结构体,在定义时同时声明2个结构体变量,但不能在其它地方声明,因为我们无法得知该结构体的标识符,所以就无法通过标识符来声明变量。
#include<stdio.h>
struct {
int sNo;
char name[10];
}stu,stu1; //匿名结构体,同时定义了2个结构体变量
int main(){
scanf("%d",&stu.sNo);
scanf("%s",stu.name);
printf("%d\n",stu.sNo);
scanf("%d",&stu1.sNo);
scanf("%s",stu1.name);
printf("%d\n",stu1.sNo);
}
三 : C++ 中结构体的继承关系
对于成员访问权限以及继承方式,struct中是public。而class中默认的是private,class还可以用于表示模板类型,struct则不行。
namespace std{
struct living_habit{ //生活习惯结构体
...
};
struct animal :public living_habit {//动物继承生活习惯结构体
...
};
struct bird :public animal{ //鸟继承动物
...
};
}
另外namespace std{} : 称namespace(命名空间),在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型:
·变量(可以带有初始化);
·常量;
·数(可以是定义或声明);
·结构体;
·类;
·模板;
四 : C++类的定义和实现
(1):定义(默认的是private):
class 类名
{
public:
//公共的行为或属性
private:
//公共的行为或属性
};
(2):实现
两种方式:一种类内 实现(setPoint),另外一种是在类内对成员函数进行声明 ,类外实现(setPoint2)
#include <iostream>
using namespace std;
class Point
{
public:
void setPoint(int x, int y) //类内 实现setPoint函数
{
xPos = x;
yPos = y;
}
void setPoint2(int x, int y); //在类内对成员函数进行声明 ,类外实现
void printPoint() //实现printPoint函数
{
cout<< "x = " << xPos << endl;
cout<< "y = " << yPos << endl;
}
private:
int xPos;
int yPos;
};
void Point2::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数
{
xPos = x;
yPos = y;
}
int main()
{
Point M; //用定义好的类创建一个对象 点M
M.setPoint(10, 20); //设置 M点 的x,y值
//M.setPoint2(10, 20); //设置 M点 的x,y值
M.printPoint(); //输出 M点 的信息
return 0;
}
概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。
效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。
注(本文作为随笔方便自己以后查看,转载请附以下参考链接):
http://blog.csdn.net/dawn_after_dark/article/details/73555562
http://blog.csdn.net/Loving_Forever_/article/details/51483828
网友评论