-
C++使用结构体时,不需在重复struct关键字,系统能自动识别。
-
C++结构体成员不仅可以是数据,还可以是函数。
-
C++的结构体相比C语言,增加了访问权限
- public(默认):都可以访问
- protected:本结构体和派生结构体可以访问
- private:外部不能访问
例:
#include六、面向对象的编程思想using namespace std; //结构体的基本用法 //C++的struct的默认权限是public struct DateStruct { public: void inputDate() { sp->year = 2022; sp->month = 4; sp->day = 27; } void outputDate(DateStruct *sp) { cout << sp->year << "-" << sp->month << "-" << sp->day << endl; } private: int year; int month; int day; }; int main() { DateStruct st; st.inputDate(); st.outputDate(); //st.year = 2023; //error,year为私有权限无法访问 return 0; }
指挥对象做相应的事。
对象的两要素:
- 属性–变量
- 方法–函数
描述某一类具体的事务对象。
2. 类的声明与定义//声明
class 类名
{
权限://public、private、protected
//成员变量-属性
//成员函数-方法
};
//定义
类名 变量名;
权限设置原则:一般成员变量私有,成员函数共有
3. 访问规则- 普通对象:通过“.”访问
- 指针对象:通过“->”访问
- 结构体是简单的数据打包,对外是透明的,默认权限是public。
- 类默认是保密封装的,对外不透明,默认权限是private。
- 默认只计算成员变量的大小。(成员函数在调用时申请内存,调用结束后会释放)。
- 空类:定义变量时,系统默认分配1bytes内存给变量。
测变量大小:sizeof(变量名)
6. 多文件编程xx.h和xx.cpp一一对应。
.h文件:类和函数的声明
.cpp文件:函数的定义
防止头文件重复定义:
#ifndef __工程名_文件名_H__ #define __工程名_文件名_H__ #include八、C++中的构造函数 1. 含义class xx { ...... }; #endif //_工程名_文件名_H_
2. 主要功能我们每次创建一个对象的时候,系统会自动调用一个函数。这个函数,我们称之为为构造函数。构造函数名就是类的名字,并且无返回值。
初始化对象。
3. 特点- (1)构造函数的名字必须和类名一致。
- (2)构造函数不能写返回值类型,没有返回值类型。
- (3)构造函数不需要用户来调用它,也不能调用它。在创建对象的时候,自动执行。
- (4)构造函数的参数及功能是由用户定义的,根据用户自己的需求设计函数功能和参数。
- (5)若是用户没有指定构造函数,系统会自动执行一个构造函数。只不过函数体是空的。
class Demo
{
public:
Demo(int val);
~Demo();
public:
void print();
void setint(int val);
private:
int ival;
}
4. 默认构造函数
创建对象时调用无参构造函数不加括号,否则会被当做函数声明。
5. 有参构造函数有参构造函数带默认值时,不要写无参构造函数。
6. 拷贝构造函数 【1】拷贝构造函数【2】普通拷贝构造函数用一个类对象初始化该类的另一个对象。
系统可以自动生成默认的拷贝构造函数,
Rational r1(1,3), r2(r1);//或r2 = r1;
一般默认的实现的是浅拷贝。
【3】浅拷贝问题:当有成员变量是指针时,拷贝后,两对象的指针均指向同一个空间,会出错:
在修改一个对象的值时,另一个也会被修改。
在对象消亡时会调用两次析构函数。即第二个对象析构时会发现空间已经被释放掉了,因此会报错。
【4】深拷贝自定义拷贝构造,示例
Copyable(const Copyable & t)
{
m_memory = new int(*t.m_memory);
m_val = t.m_val;
}
7. 限制构造函数
单例模式经常使用,只能创建一个对象的时候。
将构造函数设为private或protected
8. 析构函数在对象的生命期结束时,回收该对象占有的资源或完成一些清理工作。
没有返回值、没有函数的参数。
对象消亡前系统自动调用。
若用户没有定义,系统会自动定义。
九、C++中的初始化列表(只能用于构造函数)当我们遇到某些特殊数据的时候,例如const变量的时候。只能使用初始化列表的方式来初始化.在定义调用构造函数的时候,可以使用初始化列表来初始化对应的成员变量。
#include#include class Teacher { public: Teacher(string name, int id) { m_name = name; m_id = id; } //初始化列表 Teacher(string name, int id) : m_name(name), m_id(id) { ; } private: string m_name; int m_id; };
特点:
(1)初始化列表先与构造函数执行。也就是先把数据复制给变量,然后在执行函数体。
(2)初始化列表只能用于构造函数。
(3)初始化列表可以初始化多个数据。
(4)初始化列表和赋值不同,赋值操作是删除原值,然后赋予新的值。而初始化列表的含义是。在为变量开始空间的时候,就理解把值给赋予进去。也就是说开辟空间和初始化可以说是同时进行的,直接赋予一个值。
class string{
public:
//构造函数
string(const char *s);//创建一个stirng类,类中保存s字符串的信息
string(int n,int c);//用n个字符初始化c
const char &operator[] (int n) const;//数组下标的操作
const char &at(int n) const;//返回下标n对应的字符
const char *data() const;//返回一个非NULL终止的c字符数组
const char *c_str()const;//返回一个以NULL终止的c字符数组
int size() const;//返回当前字符串的大小
bool empty() const;//判断当前字符串是否为空
//...
}
十一、this指针
含义
-
在调用成员函数的时候,编译器会自动把调用该函数对象的地址作为一个隐含的参数传递;在成员函数内部,用this关键字来接收这个函数的参数。
-
固定指向当前的对象,只存在于成员函数中,对哪个成员调用this指针的时候,this指针就指向哪个对象。*this就是表示当前对象。
可以访问但不能修改。
- const对象
const Animale c1(100, 200); Animale const c2(100, 200);
常对象特点:
- 所有成员变量的值都不能更改
- 除了构造和析构函数外,只能调用const成员函数
- const函数
使用场景:
- 为了方便编译器检查错误,const成员函数中不能修改非const变量。
- 大型项目中,一般任何不会修改成员变量的函数都应该声明为const,加强程序的健壮性。
常引用:将一个对象传入函数,但不希望修改
十三、C++中的友元友元是一种允许非类成员函数访问类的私有或受保护成员的一种机制。
可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。
一般不用友元,因为会破坏封装性。
但在一些特殊情况时可用。如:
某些情况下,需要频繁读写类的数据成员,特别是在对某些成员函数多次调用时,由于参数传递、类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
注意:
- 友元关系是单向的
- 友元关系不具有传递性
- 友元关系不能继承



