- level 1:语法基础课
第 7 讲 类、结构体、指针、引用、文件
- 2023-8-2 16:14:22 @
类可以将变量、数组和函数完美地打包在一起。
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后面的内容是公有成员变量,在类的外部可以访问。
类的使用:
#include <bits/stdc++.h>
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 c;
c.name = "wlc"; // 正确!访问公有变量
c.age = 18; // 错误!访问私有变量
c.set_age(18); // 正确!set_age()是共有成员变量
c.add_money(100);
c.say();
cout << c.get_age() << endl;
return 0;
}
结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public。
struct 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];
习惯上把一些有关变量记录信息的、函数比较少的定义成struct
把一些复杂的、信息比较混乱、代码比较长的的定义成class
。
构造函数:
#include <bits/stdc++.h>
using namespace std;
struct Person
{
int age, height;
double money;
Person() {} // 没有参数的构造函数
Person(int _age, int _height, double _money) // 构造函数
{
age = _age;
height = _height;
money = _money;
}
// 特殊的写法:效率更高的构造函数赋值
Person(int _age, int _height, double _money) : age(_age), height(_height), money(_money) {}
};
int main()
{
Person p(18, 100, 100.0);
Person p; // 没有赋初值也不会报错
Person p = {18, 100, 100.0}; // 也可以按数组赋初值的形式赋值
return 0;
}
2. 指针和引用
指针指向存放变量的值的地址。因此我们可以通过指针来修改变量的值。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 10;
int *p = &a;
//int** q = &p;
//int*** o = &q;
*p += 5;
cout << a << endl;
return 0;
}
输出变量的地址:
#include <bits/stdc++.h>
using namespace std;
int main()
{
char c = 'a', d;
cout << (void*)&c << endl;
cout << (void*)&d << endl;
// 指针的指针
return 0;
}
数组名是一种特殊的指针。指针可以做运算:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[5] = {1, 2, 3, 4, 5};
cout << (void*)&a << endl;
for (int i = 0; i < 5; i ++ )
cout << (void*)&a[i] << endl;
for (int i = 0; i < 5; i ++ )
cout << *(a + i) << endl;
//scanf("%d", a + 1);
return 0;
}
C++引用和C指针类似,相当于给变量起了个别名。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 10;
int &p = a; // 在变量a的地址上再开一个变量p,修改p就修改a
p += 5;
cout << a << endl;
return 0;
}
3. 单链表
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node* next;
Node(int _val):val(_val), next(NULL){} // 构造函数赋初值
};
int main()
{
Node a = Node(1);
a.next, a.val; // 值用.来调用
Node* p = new Node(1); // new返回的是动态开辟的值的地址
p->next; // 指针用->来调用
// 还可以用auto
auto q = new Node(2);
auto o = new Node(3);
p->next = q;
q->next = o;
Node* head = p;
// 添加节点
Node* u = new Node(4);
u->next = head;
head = u;
// 删除节点
head->next = head->next->next;
// 链表的遍历方式
for (Node* i = head; i; i = i->next)
cout << i->val << ' ';
cout << endl;
return 0;
}
头节点:第一个节点的地址,而非值
链表的删除:是指在遍历时跳过某个点就可以了
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
Node* next;
} *head;
int main()
{
for (int i = 1; i <= 5; i ++ )
{
Node* p = new Node();
p->val = i;
p->next = head;
head = p;
}
// 链表的遍历方式
for (Node* p = head; p; p = p->next)
cout << p->val << ' ';
cout << endl;
return 0;
}
4. 文件
#include <bits/stdc++.h>
...
int main()
{
freopen("输入文件名", "r", stdin);
freopen("输出文件名", "w", stdout);
......
return 0;
}
1 comments
-
liuhanjin LV 10 @ 2023-12-5 14:36:28
《输出变量的地址》中有一个emdl
- 1