美文网首页C++我爱编程
C结构体、C++结构体 和 C++类的定义和区别

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

作者: 树懒啊树懒 | 来源:发表于2018-03-07 23:49 被阅读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

相关文章

  • c++类相关

    c++结构体与c结构体的区别 c语言 c++ c++类的使用 类的权限管理 对类的成员的访问做限制 private...

  • C++系列 --- 结构体、权限修饰符、类简介

    一、结构体 结构体:自定义的数据类型 C++ 中的结构和C中的结构有什么区别? C++中的结构除具备了C中的所有功...

  • C++ 构造函数、析构函数、拷贝构造函数

    先说C++中的类,和结构体的区别 比如说,结构体中,是不能定义方法的,只能定义指针函数 在类中,是可以定义方法的,...

  • 第九章 类和结构体

    c++中,结构体是稍有不同的类,类能做的,结构体也可以; 而swift中,结构体与类有较大区别, 结构体与类的区别...

  • C语言结构体赋值分析

    C++相比C语言的-大便利是类和结构体可以直接用等号赋值。C++为类和结构体提供了可自定义的赋值操作符opeart...

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

    一 : C语言中的结构体 (1) C语言中的结构体不能为空,否则会报错 要求一个结构或联合至少有一个成员 (2) ...

  • 面经---依依短租

    1. 结构体、共用体、类 C++中结构体与类的区别: 结构体中的成员访问权限不声明时候默认是 public 的,而...

  • Texture之ASDisplayNodeInternal.h

    c++容器 c++类型:atomic_uint 罕见的c++语法 初始化结构体 c结构体 检查指定类是否重写了另一...

  • C++类class和结构体struct区别

    在c++中类与结构体的唯一区别是:类(class)定义中默认情况下的成员是private的,而结构体(struct...

  • C++中结构体

    C++中结构体并不是C中的结构体了 C++的结构体更像是一种特殊的类 他与类一样 可以有public privat...

网友评论

    本文标题:C结构体、C++结构体 和 C++类的定义和区别

    本文链接:https://www.haomeiwen.com/subject/vpxjfftx.html