C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
C++在C语言的基础上将struct升级成了类
1、struct使用上的升级,不用typedef就可以直接用类名,类名就是类型
struct Stack
{
int* a;
int top;
int capacity;
};
int main()
{
Stack s1;
return 0;
}
2、类里面可以定义函数
struct Stack
{
int* a;
int top;
int capacity;
void Init()
{
a = nullptr;
top = 0;
capacity = 0;
}
void Push(int x)
{
//...
}
};
int main()
{
Stack s1;
s1.Init();
s1.Push(1);
s1.Push(2);
return 0;
}
C++更喜欢用class定义类
用class之后会有不同,而这个不同就得因为访问限定符
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
【访问限定符说明】
(1) public修饰的成员在类外可以直接被访问
(2) protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
(3) 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
(4) 如果后面没有访问限定符,作用域就到 } 即类结束。
(5) class的默认访问权限为private,struct为public(因为struct要兼容C)
私有与保护在继承那块有区别,这里可以先认为没有区别
C语言是函数放函数的声明,结构体直接在.h里面
C++类,类的成员放.h里面,类的函数只放声明
变量的声明与定义的区分,要看有没有开空间
Stack.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Stack
{
int* a;
int top;
int capacity;
public:
void Init();
void Push(int x);
};
test.cpp
#include "Stack.h"
void Stack::Init()
{
a = 0;
top = 0;
capacity = 0;
}
void Stack::Push(int x)
{
//...
}
int main()
{
Stack s1;
s1.Init();
s1.Push(1);
s1.Push(2);
return 0;
}
::这是域作用限定符
默认是内联,但也不一定会展开,最终展不展开还是看这个函数长不长、编译器的最终决定。
类规范定义:
长的函数声明与定义分离
短小的函数可以直接在类里面定义
下列这个问题并不会报错,但d不会被初始化,解决方法:
(1)改变参数的名称(不常用)
(2)改变成员变量的名称(eg:_year,这根据每个公司可能会不一样)
编译器会处理成下列的样子,不能显示的写
class Date
{
int _year;
int _month;
int _day;
public:
void Init(Date* this, int year, int month, int day)
{
this -> _year = year;
this -> _month = month;
this -> _day = day;
}
};
int main()
{
Date d;
Date d2;
d.Init(&d, 2024, 1, 21);
d2.Init(&d2, 2022, 10, 7);
return 0;
}
用类类型创建对象的过程,称为类的实例化
类的大小只算成员变量的大小,成员函数不在对象里面。
不同对象的成员函数是一样的
不同对象的成员变量是不一样的
因为成员函数用的都是一样的,如果每个对象都有成员函数,那么就白白浪费空间了。
要考虑内存对齐
内存对齐规定:
对于一个变量:要取其自己的对齐数与默认对齐数小的那个
这个类的大小是8
class Test2
{};
int main()
{
Test2 B;
return 0;
}
B的大小是 : 1,因为要占位。无成员变量的类(可以有成员函数),对象大小开一个字节,这个字节不存储有效数据,标识定义的对象存在过。
【C++第一课 - C++入门】相关软件(vs、gitee)、命名空间、输入输出流、缺省参数、函数重载、引用、内联函数、auto、范围for(语法糖)、nullptr