C++:数据类型
1 C++
1.1 什么是C++语言呢?
C++语言是面向过程编程的高级语言, 同时也可以向高级语言一样面向对象编程,泛型编程;
C++语言派生自C语言,所以C++语言可以向下兼容C语言;C++相比C,扩展了面向对象编程,泛型编程;
C++语言大小写敏感,支持ANSI标准;
G++编译器是将 gcc 默认语言设为 C++ 的一个特殊的版本;如果命名遵循规范,那么通过gcc来编译c++也是可行的;
1.2 C++面向对象的特性
1.2.1 封装 Encapsulation:将程序打包封装成接口,隐藏实现细节,只对外提供调用接口;
1.2.2 继承 Inheritance: 从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法;
1.2.3 多态 Polymorphism:同一种操作作用于不同的对象,可以有不同的解释和实现。它可以通过接口或继承实现,可以提高代码的灵活性和可读性;
1.2.4 抽象 Abstraction: 从具体的实例中提取共同的特征,形成抽象类或接口,以便于代码的复用和扩展;
1.3 C++语言分布
1.3.1 基础数据结构: 变量,数据类型,常量等; 用于构造数据类;
1.3.2 C++标准库: C++标准库函数; 用于操作文件,字符串等;
1.3.3 C++标准模板库(STL): C++标准库方法函数; 用于操作数据结构等;
2 C++基本语法
2.1 数据类型转换 cast
2.1.1 静态转换 static_cast: 用于将一种数据类型的值 转换为 另一种相似的数据类型的值;
转换时不进行类型检查,因此可能会引发异常;
2.1.2 动态转换 dynamic_cast: 用于将基类指针或引用 转换为 派生类指针或引用;
转换时会进行类型检查,如果不能进行转换则返回空指针或引发异常;
2.1.3 常量转换 const_cast: 用于将const类型的对象属性 转换为 非const类型的对象属性;
2.1.4 重新解释转换reinterpret_cast:用于将一种数据类型的值 转换为 另一种数据类型的值;
转换时不进行类型检查,因此可能会引发异常;
int i = 10; float f = static_cast<float>(i); // 静态将int类型转换为float类型 class Base {}; class Derived : public Base {}; Base* ptr_base = new Derived; Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base); // 将基类指针转换为派生类指针 const int i = 10; int& r = const_cast<int&>(i); // 常量转换,将const int转换为int int i = 10; float f = reinterpret_cast<float&>(i); // 重新解释将int类型转换为float类型
2.2 类作用域变量
声明在类内部的变量,使用类名和作用域解析运算符“::”来访问;
#include <iostream> class MyClass { public: static int class_var; // 类作用域变量 }; int MyClass::class_var = 30; int main() { std::cout << "类变量: " << MyClass::class_var << std::endl; return 0; }
2.3 引用变量
2.3.1 引用变量声明
定义:引用其他变量的变量,作用类似指针但不是指针;
属性:引用变量在创建时必须初始化其被引用对象,引用变量的被引用对象不能修改;不存在空引用;
int i; int& r = i; //声明引用变量r,i是被引用变量;这样可以通过r,i变量访问同一块内存;
2.3.2 引用变量作用
2.3.2.1 作为函数形参传递,传递之后对引用变量的修改就相当于对被引用变量的修改,作用等价于指针,但是更安全;
2.3.2.2 作为函数返回值传递;注意这里有点反常识但是合理,此时函数可以被放在等式左边用来赋值;
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0}; double& setValues(int i) { double& ref = vals[i]; // 这里引用声明,传递的是vals[i]的内存,那可不就是地址了嘛; return ref; // 返回引用变量,这样函数就可以被放在等式左边用来赋值了; } setValues(1) = 20.23; // 将20.23存储到 vals[1]了;
3 类
类是一种自定义数据类型,可以用来创建具有相同属性和行为的多个对象;是C++的核心特性;
#include<iostream> using namespace std; //记录一下我的第一个c++程序,虽然这是一个因为傻吊主管而半途而废的新起点; class Box{ //声明一个类,名字为Box; public: //声明类成员的访问属性public; double length; //声明类变量 double height; void set(double length,double height); //声明类方法函数 double get_area(void){ //函数定义在类内,则默认声明为内联inline函数; return length * height; } }; void Box::set(double len, double hei){ length = len; height = hei; } int main(){ cout<<"hello c++ \n"<<endl; Box box1; double area; box1.set(15,30); area = box1.get_area(); cout<<"box1.get_area:"<< area <<endl; }
3.1 类成员 访问修饰符
一个类内部可以有多种访问修饰符,不写访问修饰符默认为private属性;
3.1.1 public 公有属性: 在当前类、类的外部也可以访问类内部的公有成员;
3.1.2 protected 受保护属性: 在当前类、友元函数和派生类中可以访问受保护成员;
3.1.3 private 私有属性: 在当前类、友元函数可以访问私有成员;派生类不可以访问;
3.2 派生类 继承属性
派生类成员可以继承基类成员的访问属性;private继承,则派生类成员不能访问基类成员;
3.2.1 public class_A 继承: 基类 public,protected,private成员的访问属性在派生类中分别变成:public, protected, private;
3.2.2 protected class_A 继承: 基类 public,protected,private成员的访问属性在派生类中分别变成:protected, protected, private;
3.2.3 private class_A 继承: 基类 public,protected,private成员的访问属性在派生类中分别变成:private, private, private;
3.3 构造函数
类的构造函数 会在每次创建新的类对象时执行;
名称与类完全相同,没有返回类型,可以带参数类型;作用主要是用于为成员变量设置初值;
3.4 析构函数
类的析构函数 会在每次删除已创建的类对象时执行;
名称与类完全相同但是加了一个~,没有返回类型,没有参数类型;作用主要是用来释放资源;
3.5 拷贝构造函数
3.6 友元函数
3.7 内联函数
3.8 this指针
3.9 指向类的指针
3.10 静态成员
4 纯虚函数
声明在基类中的函数;它在基类中没有定义不能实例化,由派生类重新声明后才能实例化;看来主要作用是占位,先放着;
模板
//比如定义的时候是template<class V, class M=void>; //那等会代码中的类名V就替换掉;代码中的M就替换成void; //比如在在View类中写了 template<class P> //引用的时候代码为:View<WatchDrainagePresenter> //表示等下View类中的V都用WatchDrainagePresenter替代了;
上面这几个类型转换里,const_cast<>,reinterpret_cast<>里为什么有& ??先放着;
引用变量的&号靠近变量放着可以么?先放着;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?