C++ 语法基础课7 —— 类、结构体、指针、引用

1. 类和结构体

1.1 类的定义

class Person
{
    private:
        int age, height;
        double money;
        string books[100];
    
    public:
        string name;// 变量
        
        void say()
        {
            cout << "I'm " << name << endl;
        }
        
        int get_age
        {
            return age;
        }

		void add_money(double x)// 函数
		{
			money += x;
		}
);
  • 类中的变量和函数被统一称为类的成员变量
  • private后面的内容是私有成员变量在类的外部不能访问public后面的内容是公有成员变量,在类的外部可以访问

1.2 类的使用

#include <iostream>
using namespace std;
const int N = 1000010;

class Person
{
    private:// 私有内容
        int age, height;
        double money;
        string books[100];
    
    public:// 公共内容
        string name;
        
        void say()
        {
            cout << "I'm " << name << endl;
        }
        
        int set_age(int a)
        {
            age = a;
        }
        
        int get_age()
        {
            return age;
        }
    
        void add_money(double x)
        {
            money += x;
        }
} person_a, person_b, persons[100];// 可以声明一个数组

int main()
{
	Person persons[100];
    Person c;
    
    c.name = "yxc";      // 正确!访问公有变量
    c.age = 18;          // 错误!访问私有变量
    c.set_age(18);       // 正确!set_age()是共有成员变量
    c.add_money(100);
    
    c.say();
    cout << c.get_age() << endl;
    
    return 0;
}
  • 结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public

1.3 结构体

  • 结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public
struct Person
{
    private:
        int age, height;
        double money;
        string books[100];
		
		int get_height()
		{
			return height;
		}
    
    public:
        string name;
        
        void say()
        {
            cout << "I'm " << name << endl;
        }
        
        int get_age
        {
            return age;
        }

		void add_money(double x)
		{
			money += x;
		}
)person_a, person_b, persons[100];

1.4 构造函数

#include <iostream>
using namespace std;

struct Person
{
	int age, height;
    double money;
	// 无参构造函数
	Person() {}

	Person (int _age. int _height) : age(_age), hight(_hight) {}
	
	// 有参构造函数
	Person(int _age, int _height, double _money)// 名称和结构体一样
	{
		age = _age;
		height = _height;
		money = _money;
	}

	// 另外一种赋值的方式
	Person(int _age, int _height, double _money) : age(_age), hight(_hight), money(_money){}
};// 一定加封号

int main()
{
	Person p;// 无参构造函数
	Person p(18, 180, 100.0);// 调用构造函数
	Person p = {18, 180, 100.0};
	return 0}

2. 指针和引用

2.1 指针

  • 指针指向存放变量的值的地址,因此我们可以通过指针来修改变量的值
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int* p = &a;
	*p += 5;
	cout << *p << endl;
	return 0;
}
  • 通过指针修改变量的值
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int* p = &a;
	int** q = &p;// 求p本身的地址
	cout << q << endl;// 打印指针p的地址
	cout << *p << endl;// 10
	*p = 12;
	cout << *p << endl;// 12
	cout << a << endl;// 12,读取并修改变量的值
	return 0;
}

2.2 数组

  • 数组名是一种特殊的指针。指针可以做运算
#include<iostream>
using namespace std;

int main()
{
	int a[5] = {1,2,3,4,5};
	for(int i = 0; i < 5; i++) cout << *(a + i) << endl;
	return 0;
}
#include<iostream>
using namespace std;

int main()
{
	char c;
	int a[5] = {1,2,3,4,5};
	
	int* p = &a[0], *q = &a[1];
	cout << q - p << endl;
	return 0;
}
  • 查询数组的地址
#include<iostream>
using namespace std;

char a, b;

int main()
{
	char c;
	int a[5] = {1,2,3,4,5};

	cout << (void*)&c << endl;
	cout << a << endl;
	for(int i = 0;i < 5;i++)
		cout << (void*)&a[i] << endl;
	return 0;
}

在这里插入图片描述

  • 数组地址间隔4个字节,int型是4个字节
    在这里插入图片描述

2.3 引用

  • 引用和指针类似,相当于给变量起了个别名
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int &p = a;
	p += 5;
	cout << p << endl;
	return 0;
}
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int* p = a;// 指针
	int& p = a;// 引用,别名
	p += 5;
	cout << p << endl;
	return 0;
}

2.4 查询地址

#include<iostream>
using namespace std;

int main()
{
	char c = 'a', b;// 局部变量定义在栈空间,全局变量定义在堆空间
	cout << (void*)&c << endl;
	cout << (void*)&b << endl;// 连续定义的变量,地址相邻
	return 0;
}

在这里插入图片描述

3. 链表

在这里插入图片描述

#include<iostream>
using namespace std;

struct Node
{
	int val;
	Node* next;

	Node(int _val) : val(_val), next(NULL) {} // 默认构造函数,NULL说明是空指针
}*head;

int main()
{
	// 分别给链表结点赋值1,2,3
	Node* p = new Node(1);// new Node(1)表示定义一个Node类型的变量,返回的是变量的地址。加new返回的是地址,不加new返回的是值。生成一个结构体,结构体指针放在p里面
	Node* q = new Node(2);
	auto o = new Node(3);// auto 是自动判断类型是指针结点类型

	p->next = q;
	q->next = o;

	// 	添加结点4
	Node* u = new Node(4);
	u->next = head;// 将Head赋值给u->next
	head = u;// head头结点指向u

	// 删除结点1
	head->next = head->next->next;// 右边head->next是指1

	// 遍历链表中字符
	Node* head = p;// 头结点是p

	for(Node* i = head; i != 0; i = i->next)// i = 0时结束,i->next是指下一个结点
		cout << i->val << endl;// 输出的是值

	return 0;
}

在这里插入图片描述

3.1 添加结点

Node* u = new Node(4);
u->next = head;// 将Head赋值给u->next
head = u;// head头结点指向u
  • u->next = head; 将head赋值给u->next
    在这里插入图片描述
  • head = u; 将结点u赋值给head
    在这里插入图片描述
    在这里插入图片描述

3.2 删除结点

在这里插入图片描述

// 删除结点1
head->next = head->next->next;// 右边head->next是指1

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NqqGOGO

你的鼓励是我学习的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值