C++我爱编程

C结构体、C++结构体 和 C++类的定义和区别

2018-03-07  本文已影响86人  树懒啊树懒
C语言中的结构体

一 : 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

上一篇 下一篇

猜你喜欢

热点阅读