C++:结构体、类、命名空间的使用和继承

结构体定义

struct StructName {
    // 成员变量
    DataType1 member1;
    DataType2 member2;
    // ...
    DataTypeN memberN;

    // 成员函数(可选)
    ReturnType functionName(Parameters) {
        // 函数体
    }
};
struct:关键字用于定义结构体。
StructName:结构体的名称。结构体名称遵循标识符命名规则。
成员变量:结构体中包含的数据成员。每个成员变量都有其类型和名称。
成员函数(可选):结构体中可以包含成员函数,用于操作结构体的数据成员。成员函数的定义在结构体内部,通常,结构体内部只应包含成员变量和成员函数的声明,**而实际的实现应该在类外部。**
example:

```cpp
// 定义结构体
struct Person {
    // 成员变量
    std::string name;
    int age;

    // 成员函数
    void display() {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

结构体的内容

在C++中,结构体可以包含各种不同类型的成员,包括但不限于:
1、基本数据类型: 整数、浮点数、字符等。

struct Person {
    int age;
    float height;
    char gender;
};

2、其他结构体: 结构体可以包含其他结构体作为其成员。

struct Date {
    int day;
    int month;
    int year;
};

struct Student {
    std::string name;
    Date birthdate;
    int rollNumber;
};

3、数组: 结构体内可以包含数组,这样就可以表示一组相关的数据。

struct Rectangle {
    float width;
    float height;
    float corners[4]; // Array representing coordinates of corners
};

4、指针: 可以包含指向其他数据类型的指针。

struct Node {
    int data;
    Node* next; // Pointer to the next node in a linked list
};

5、函数指针: 结构体内可以包含指向函数的指针。

struct MathOperations {
    int (*add)(int, int);
    int (*subtract)(int, int);
};

6、枚举类型: 可以包含枚举类型作为成员。

enum Color { RED, GREEN, BLUE };

struct ColoredObject {
    Color color;
    int size;
};

7、成员函数: C++中的结构体可以包含成员函数。

struct Circle {
    float radius;
    float getArea() {
        return 3.14 * radius * radius;
    }
};

类的定义

class MyClass {
public:
    // 公有成员(可以在类外访问)
    // ...

private:
    // 私有成员(只能在类内访问)
    // ...

protected:
    // 保护成员(可以在类及其派生类中访问)
    // ...
public:
    // 构造函数
    MyClass();

    // 公有成员函数的原型声明
    void publicFunction1();
    void publicFunction2(int parameter);

    // 析构函数
    ~MyClass();
};
MyClass::MyClass() {
    std::cout << "Constructor called" << std::endl;
}

// 公有成员函数1的实现
void MyClass::publicFunction1() {
    std::cout << "Public Function 1 called" << std::endl;
}

// 公有成员函数2的实现
void MyClass::publicFunction2(int parameter) {
    std::cout << "Public Function 2 called with parameter: " << parameter << std::endl;
}

// 析构函数的实现
MyClass::~MyClass() {
    std::cout << "Destructor called" << std::endl;
}

类里面定义的函数,可以类外写它的实现方式,注意函数格式
类名::函数名

命名空间

我也是第一次知道命名空间这种东西,目前为止还没有做过c++方面的开发,很多东西都是存在于一个理论层面,现在就一边读代码,一边学习,一边记录我学到的理论知识

命名空间的定义

命名空间(Namespace)在C++中用于解决命名冲突的问题,它可以包含以下内容:

1、变量: 命名空间可以包含变量的声明和定义。

2、函数: 命名空间可以包含函数的声明和定义。

3、类和结构体: 命名空间可以包含类和结构体的声明和定义。

4、其他命名空间: 命名空间可以嵌套,一个命名空间可以包含其他命名空间。

5、枚举: 命名空间可以包含枚举的声明。

6、类型定义(typedef): 命名空间可以包含类型定义。
一个命名空间的基本结构如下:

namespace MyNamespace {
    // 变量声明/定义
    extern int myVariable;

    // 函数声明/定义
    void myFunction();

    // 类声明/定义
    class MyClass {
        // ...
    };

    // 其他命名空间
    namespace NestedNamespace {
        // ...
    }

    // 枚举声明
    enum MyEnum {
        // ...
    };

    // 类型定义
    typedef int MyType;
}

命名空间的主要作用有两个:

避免命名冲突: 命名空间允许将相同名称的实体(如变量、函数、类等)组织在一个逻辑单元中,避免了命名冲突。

代码组织和模块化: 命名空间可以帮助组织代码,将相关的实体放在一个逻辑单元中,提高代码的可维护性和可读性。
命名空间使用演示:
使用命名空间限定符来调用相应的函数或变量等
命名空间的调用方式
命名空间::变量/函数

#include <iostream>

// 定义命名空间
namespace Math {
    const double PI = 3.141592653589793;

    double add(double a, double b) {
        return a + b;
    }
}

int main() {
    // 使用命名空间中的常量和函数
    std::cout << "PI: " << Math::PI << std::endl;
    std::cout << "Sum: " << Math::add(2.0, 3.0) << std::endl;

    return 0;
}

同名函数在不同的命名空间中的调用

#include <iostream>

// 第一个命名空间
namespace Namespace1 {
    void commonFunction() {
        std::cout << "Function in Namespace1" << std::endl;
    }
}

// 第二个命名空间
namespace Namespace2 {
    void commonFunction() {
        std::cout << "Function in Namespace2" << std::endl;
    }
}

int main() {
    // 调用第一个命名空间的函数
    Namespace1::commonFunction();

    // 调用第二个命名空间的函数
    Namespace2::commonFunction();

    return 0;
}

命名空间与类的区别和联系

命名空间中的函数可以和命名空间中的类的内部函数同名
命名空间中的类的内部函数可以和命名空间外部的类中的函数同名

#include <iostream>

// 在命名空间中定义同名函数
namespace MyNamespace {
    void commonFunction() {
        std::cout << "Namespace Function" << std::endl;
    }
    //函数声明
	void A();
    // 在命名空间中定义同名类
    class MyClass {
    public:
    // 构造函数声明
        MyClass();
        void commonFunction() {
            std::cout << "Namespace Class Member Function" << std::endl;
        }
        //成员函数声明
        void A();
        void B();
         // 析构函数声明
        ~MyClass();
    };
    // 在命名空间内部实现函数 B
    void MyClass::B() {
        std::cout << "Function B called" << std::endl;
    }
}
// 函数的实现
void MyNamespace::A() {
    // 实现函数的具体逻辑
}
//命名空间内部类的构造函数在命名空间外部的实现
MyNamespace::MyClass::MyClass() {
    std::cout << "Constructor called" << std::endl;
}
// 成员函数的实现
void MyNamespace::MyClass::A() {
    std::cout << "Member Function called" << std::endl;
}
// 析构函数的实现
MyNamespace::MyClass::~MyClass() {
    std::cout << "Destructor called" << std::endl;
}

// 在命名空间外部定义同名类
class MyClass {
public:
	//构造函数
	MyClass();
	 // 成员函数
    void commonFunction() {
        std::cout << "Global Class Member Function" << std::endl;
    }
    //成员函数的声明
    void A();
    //析构函数
    ~MyClass();
};
//在类外实现类内定义的函数
// 构造函数的实现
MyClass::MyClass() {
    std::cout << "Constructor called" << std::endl;
}
void MyClass::A() {
    std::cout << "Member Function called" << std::endl;
}

// 析构函数的实现
MyClass::~MyClass() {
    std::cout << "Destructor called" << std::endl;
}

// 实现同名函数
void commonFunction() {
    std::cout << "Global Function" << std::endl;
}

int main() {
    // 调用命名空间中的函数
    MyNamespace::commonFunction();

    // 创建命名空间中的类的对象并调用类的函数
    MyNamespace::MyClass namespaceObj;
    namespaceObj.commonFunction();

    // 创建命名空间外部的类的对象并调用类的函数
    ::MyClass globalObj;
    globalObj.commonFunction();

    // 调用命名空间外部的函数
    ::commonFunction();

    return 0;
}

总结一下就是:
1、命名空间: 在命名空间内部定义的函数,可以在命名空间外部实现,eg:void MyNamespace::A() {},或者命名空间内部实现,eg:void commonFunction() {}
2、命名空间内的类:函数可以在命名空间外部实现,eg:MyNamespace::MyClass::MyClass() {} ,
可在类内实现,eg:void commonFunction() {}
可在类外,命名空间内部实现,eg: void MyClass::B() {},
3、命名空间外的类,可以在类外实现,或者类内实现:void MyClass::A() {},void commonFunction() {},
当存在同名函数,并且这些函数分别位于命名空间内、命名空间的类内以及命名空间外部的类中,同时这些同名函数在类外实现时,可以通过以下方式进行调用:

  • 命名空间内的同名函数:
MyNamespace::commonFunction();

  • 命名空间中的同名类的同名函数:
MyNamespace::MyClass namespaceObj;
namespaceObj.commonFunction();
  • 命名空间外部的同名函数:
::commonFunction();
  • 命名空间外部的同名类的同名函数:
MyClass globalObj;
globalObj.commonFunction();		
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我知道了。下面是C语言定义结构体并申明一个该结构体变量的示例代码: ``` #include <stdio.h> // 定义结构体 struct Student { char name[20]; int age; float score; }; int main() { // 声明结构体变量 struct Student stu; // 对结构体变量进行赋值 strcpy(stu.name, "Tom"); stu.age = 18; stu.score = 90.5; // 输出结构体变量的值 printf("name: %s\n", stu.name); printf("age: %d\n", stu.age); printf("score: %.1f\n", stu.score); return 0; } ``` 在这个示例代码中,我们定义了一个名为`Student`的结构体,该结构体包含了三个成员:`name`、`age`和`score`。然后在`main`函数中,我们声明了一个名为`stu`的`Student`型变量,并对其进行了赋值。最后,我们输出了这个结构体变量的成员值。 ### 回答2: C语言中可以用关键字struct来定义结构体,并使用typedef关键字给结构体取一个别名,方便后续使用。 具体申明一个该结构体变量的方式为: 1. 首先,我们需要定义结构体的成员变量和成员函数(如果有的话)。例如,我们定义一个结构体Person,其中包括姓名和年龄作为成员变量。 ```c typedef struct { char name[20]; int age; } Person; ``` 2. 接下来,我们就可以使用结构体定义一个结构体变量了。例如,我们定义一个名为person1的结构体变量,并为其成员变量赋值。 ```c int main() { Person person1; // 定义一个Person型的结构体变量person1 strcpy(person1.name, "张三"); person1.age = 20; printf("姓名:%s,年龄:%d\n", person1.name, person1.age); return 0; } ``` 以上代码定义了一个名为person1的结构体变量,并为其成员变量赋值。最后使用printf函数打印出了person1的姓名和年龄。 注意:在使用结构体变量之前,需要先定义结构体。在定义结构体变量时,可以直接使用结构体的别名。结构体变量的成员变量可以通过`.`(点操作符)来访问。 ### 回答3: C语言定义结构体的关键字是"struct",结构体是一种自定义的数据型,用于存储不同数据型的集合。 结构体的定义格式为: ```c struct 结构体名称 { 数据型 成员1; 数据型 成员2; ... }; ``` 其中,结构体名称是自定义的,根据需求命名。 例如,我们定义一个结构体"Person",包含姓名和年龄两个成员: ```c struct Person { char name[20]; int age; }; ``` 在定义结构体之后,我们可以声明一个该结构体变量,即为结构体分配内存空间,并且可以操作结构体成员变量。 例如,声明一个"Person"型的变量person: ```c struct Person person; ``` 在此之后,我们可以为结构体成员变量赋值,如: ```c strcpy(person.name, "张三"); person.age = 20; ``` 这样,我们就定义并声明了一个名为"person"的"Person"型的结构体变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值