10min快速回顾C++语法(七)结构体、类、指针专题

C++的语法基础(七)

⭐写在前面的话:本系列文章旨在短时间内回顾C/C++语法中的重点与易错点,巩固算法竞赛与写题过程中常用的语法知识,精准地解决学过但有遗忘的情况,为算法刷题打下坚实的基础。

10.1类与结构体

10.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后面的内容是公有成员变量,在类的外部可以访问。

可以定义多个private在不同的位置

10.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 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。

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];

10.1.3 结构体的构造函数

#include <iostream>

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;//会调用第一种构造函数,如果没有定义第一种构造函数,则会报错
    Person p2( 18 , 180 , 618.1);//会调用第二种构造函数
    return 0;
}

10.2 指针和引用

指针指向存放变量的值的地址,因此我们可以通过指针来修改变量的值。

#include <iostream>

using namespace std;

int main()
{
    int a = 10;
    int *p = &a;//定义指针并赋值 
    int** q = &p;//可以定义指针的指针

    *p += 5;
    cout << a << endl;

    return 0;

}

数组名是一种特殊的指针。指针可以做运算:

#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()
{
    int a = 10;
    int &p = a;//引用、别名

    p += 5;
    cout << a << endl;

    return 0;

}

img

  • 栈区间是从小到大分配
  • 堆区间是从大到小分配

10.3 链表

#include <iostream>

using namespace std;

struct Node
{
    int val;
    Node* next;//定义一个指针Node,此处不能定义一个变量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;

}

10.3.1 链表详解

#include <isotream>
using namespace std;

struct Node
{
    int val ;
    Node* next;

    Node(int _val): val(_val),next(NULL){}//定义构造函数
};

int main()
{
    /*
    Node node = Node(1);//值为1,指向空的节点 返回是这个变量的值
    Node* p = &node;//然后把它放在指针中
    */

    //与上面等价,c++可以生成一个结构体,把结构体指针放在p中
    Node* p = new Node(1);
            //返回是这个变量的地址,可以理解为动态开辟了一段空间,这段空间的地址给p

    p -> next = p;//让指针指向自己。
                  //这里解释一下->,由于p是一个地址,因此p如果调用成员的next方法,必须通过->调用
   /* 
    Node a = Node(1);
    a.next ,a.val;//而对于a是一个变量,只需要采用.的方式调用即可
    */

    auto q = new Node(2);//也可以用auto自动判断
    p -> next = q;
}

这样的数据结构就叫做链表。通常会把链表的第一个节点的地址放在head(头节点)中。

10.3.2 遍历链表

#include <isotream>
using namespace std;

struct Node
{
    int val ;
    Node* next;

    Node(int _val): val(_val),next(NULL){}//定义构造函数
};

int main()
{
    Node* p = new Node(1);
    Node* q = new Node(2);
    Node* o = new Node(3);

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

    Node* head = p;//定义head指针等于p

    for(Node* i = head ; i ; i = i -> next)
        cout << i ->val <<endl;
    return 0;
}

10.3.3 链表的添加

由于遍历节点是从前往后的,因此后面的节点地址不知道。因此通常会在最前面添加新节点。

Node* u = new Node(4);
u -> next = p;
head = u;

10.3.4 链表的删除

链表的删除是指在遍历中跳过这个节点或者在遍历时遍历不到这个点。

head -> next = head -> next -> next; 
#c++#
全部评论
厉害了!要学的太多了
点赞 回复 分享
发布于 2022-08-24 09:01 江苏

相关推荐

时间线:&nbsp;1.4-1.5:&nbsp;boss&nbsp;牛客&nbsp;官网&nbsp;实习僧海投了两天,&nbsp;感觉确实没啥招人的啊,&nbsp;心里凉了一半.1.6:&nbsp;中午快手约面,&nbsp;下午字节hr飞书私聊约面,&nbsp;当时想着第一次面大厂感觉三个过一个一面就已经赢了.1.7:&nbsp;下午&nbsp;3点大厂处女面,&nbsp;哈哈面试官是重邮红岩的直接保送;&nbsp;5点快手一面,&nbsp;我说这个是我的第二次大厂面试,&nbsp;面试官问要是拿到字节和快手选择哪个,&nbsp;我说昨天看了一晚上快手百分百选快手哈哈哈.&nbsp;晚上5.30字节约二面,&nbsp;快手约二面,&nbsp;小红书约一面.1.8:&nbsp;下午2点快手二面,&nbsp;聊天面体验非常好(当天电话确认入职时间);&nbsp;4点字节二面这次不是校友了,&nbsp;然后有一个CSS实现switch效果的忘记属性咋写了,&nbsp;感觉危了;&nbsp;7.30&nbsp;问字节hr是不是挂了;&nbsp;9点开始小红书一面,&nbsp;难死我了,&nbsp;但我还是笑着面完了,&nbsp;然后卸载了小红书,&nbsp;但是过了一会会小红书hr约二面,&nbsp;遂下回来了字节约三面.1.9:&nbsp;下午2点字节三面,&nbsp;依旧聊天+算法,&nbsp;自己太菜了有一个写错了,&nbsp;面完感觉又危了;&nbsp;5点面小红书20min结束(offer审批);5.30又去问字节hr是不是挂了,&nbsp;hr小姐姐说干嘛用一个句式,&nbsp;我说手写题又又又没写出来😂,&nbsp;2min后约hr面;8.30&nbsp;快手offer总结,&nbsp;自己运气好遇到了好公司好部门好面试官,&nbsp;字节剪映&nbsp;快手电商&nbsp;小红书支付的面试体验都非常好,&nbsp;不会的题会带你一步一步思考,&nbsp;流程也非常快全部都是当天推进,&nbsp;小红书是以分钟为单位推进.&nbsp;&nbsp;面经以及细节等我慢慢整理,&nbsp;&nbsp;以及保佑所有的审批不要出问题,&nbsp;我是真怕最后全过了0offer😂bg:&nbsp;重邮&nbsp;大数据&nbsp;蓝山工作室&nbsp;一段非大厂实习
独角仙梦境:这是真👻了
找实习记录
点赞 评论 收藏
分享
01-22 14:36
门头沟学院 Java
不知道怎么取名字_:我就好奇,你是这家的hr还是?咋这都能搞到
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务