C++类和对象系列文章目录
提示:C++类和对象的基础知识点,后续再补充
文章目录
- C++类和对象系列文章目录
-
- 1.1C和C++中的结构体struct
- 1.2 类声明和变量分离
- 1.3 类的封装
- 1.4 类外使用成员函数 在类外使用::作用域解析符来指明成员属于哪个类
- 1.5 声明和定义的拓展
- 1.6 对象中只会存储成员变量,而不会存储成员函数。why?
- 1.7 类对象中隐含的this指针
- 1.8 构造函数:初始化对象
- 1.9 无参的构建函数和全缺省构造函数
- 1.10 析构函数
- 1.11 拷贝构造 :采用同类对象来构造新的对象
- 1.12 运算符重载
- 1.13 const如何修饰this指针
- 1.14 关于类中const权限无法放大的应用
- 1.15 初始化列表 与 成员变量的声明和定义
- 1.16 类中的 static成员变量和static成员函数
- 1.18 数组对象 Data a[10]; 会调用10次构造函数
- 1.19 类中声明时给缺省
- 1.20 有元函数
- 1.21 有元类
- 1.22 内存基础知识
- 1.23 C++的动态内存(堆上空间)管理 new delete
- 1.24 operator new(不调用构造)和new(调用构造) operator delete(不调用析构) 和delete(调用析构)
- 1.25 A=B的返回值是A
- 1.26 定位new
- 1.27 模版template 兼容任何类型的代码 函数模版
- 1.28 类模版
- 1.29 模版底层原理
- 1.30 匿名对象 对象名();
1.1C和C++中的结构体struct
在 C 语言中,结构体主要用于定义数据类型,主要用来组合不同类型的变量。然而,在 C++ 中,结构体的功能得到了扩展,不仅可以定义变量,还可以定义成员函数。因此,C++ 中的结构体实际上可以视为一种特殊的类。
C vs C++ 中的结构体
-
C 语言:
- 结构体只能用于定义数据类型和变量。
- 结构体的功能相对简单,主要用于数据的组合。
-
C++ 语言:
- 结构体可以定义变量和成员函数。
- 支持访问修饰符(如
public
和private
),使得结构体的封装性更强。 - 可以进行继承和多态,进一步增强了其功能。
因此,虽然 C++ 中的结构体在某些方面与类相似,但由于它们在默认访问控制和用途上的一些区别,仍然可以将其称为结构体。
struct Student
{
void SteStudentInfo(const char* name,const char* gender,int age)
{
strcpy(_name,name);
strcpy(_gender,gender);
_age = age;
}
void printStudentInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
char _name[20];
char _gender[3];
int _age;
};
虽然结构体和类在功能上有很多相似之处,但 C++ 专门定义了 class 来实现面向对象编程,以提供更严格的封装和访问控制。这使得开发者可以更好地管理数据和功能,促进代码的重用和维护。
1.2 类声明和变量分离
person.h 文件中
class Person
{
public:
void ShowInfo();
private:
char* _name;
char* _sex;
int _age;
};
person.cpp文件中
#inclde "person.h"
void Person::showInfo()
{
cout<<_name<<"_"<<_sex<<"_"<<_age<<_endl;
}
1.3 类的封装
public(公有) 类外也可以访问
protected(保护)和private(私有)类外无法访问
class默认访问权限:私有 private
struct默认访问权限:共有 public 兼容C
1.4 类外使用成员函数 在类外使用::作用域解析符来指明成员属于哪个类
class Person
{
public:
void ShowInfo();
private:
char* _name;
char* _sex;
int _age;
};
void Person::showInfo() //成员函数类外需要指明所属类
{
cout<<_name<<"_"<<_sex<<"_"<<_age<<_endl;
}
1.5 声明和定义的拓展
声明是一种承诺,其不分配空间;
定义是对象的实例化,分配空间;
声明可以多次,但是定义只能一次
声明可以在多个源文件中,通过#ifndef来解决,而定义只能在一个源文件中。
1.定义的情况
万物皆可以对象
类名 对象名;(数据类型 变量) +函数定义
```cpp
int x; //变量定义 分配空间
Person p; //对象定义 分配空间
int Add(int x,int y) //函数定义 分配栈空间
{
return x+y;
}
1.声明的情况
extern int x;
(extern) int Add(intx,int y);
1.6 对象中只会存储成员变量,而不会存储成员函数。why?
在 C++ 中,一个类可以实例化出多个对象,这些对象的成员函数相同,但它们的成员变量值各异。为了节省空间,成员变量存储在每个对象实例中,而成员函数则存储在公共代码区中。
注意:如果一个空对象有一个字节的空间,why,占位,方便取地址。
1.7 类对象中隐含的this指针
1.this指针指向 谁调用指向谁, this指针是类中的成员函数的第一个参数
2.this指针不能为空,空的this,会导致 this->变量是报错
class Date
{
public:
void Init(int year,int month,int day)
{
_year = year;
_month =month;
_day = day;
}
>>>>>>>>>>>>>>>>编译器编译为>>>>>>>>>>>>>>>>>>
void Init(Data* this,int year,int month,int day)
{
this->_year = year;
this->_month =month;
this->_day = day;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
private:
int _year;
int _month;
int _day;
};
int mian()
{
Date d1;
d1.Init(2020,4,7)//
>>>>>>>>>>>>>>>>编译器编译为>>>>>>>>>>>>>>>>>>
d1.Init(&d1,2020,4,7);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
}
1.8 构造函数:初始化对象
1.函数名和类名一样
2.无返回值
3.对象实例化时自动调用
4.构造函数可以重载
5.如果未定义构造函数,编译器会自动生成一个无参的默认构造函数
6.默认的析构在定义对象 会随机初始化内置类型的值
对于自定义类型 会调用对于的构造函数
class Time
{
public:
Time() //构造函数 函数名和类名一样 无返回值
{
_hour = 0;
_minute = 0;
_second =0;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
void Print()
{
cout<<_year<<"_"<<_month<<"_"<<_day<<endl;
}</