新闻详情

新闻详情

首页 / 资讯中心 / 详情

三、C++基础

发布时间:2026/9/15 11:24:42来源:尧图网络
三、C++基础
重点梗概命名空间 namspace 为了防止名字冲突using namespace std;cout和cin都属于std也可以写成 std::cin std::coutCC C新增bool类型新的C标准也有bool类型C变量可实现随用随定义cin和cout的用法C面向对象 类是抽象出来的用户定义的类型数据方法函数都是类的成员对象实际事物也就是实例化出来的。string字符串类型使用频率较高从堆中实例化对象需要开辟内存指针会指向那个内存如果new没有申请成功p指向NULL程序自动退出下面就不执行了这是为了程序严谨。用完释放内存再将p指向NULL。this指针每个对象都有一个this指针他记录了对象的内存地址指向当前类的当前实例化对象。this在成员函数中使用全局函数、静态函数不能使用this实际上成员函数默认第一个参数是T * const this也就是一个类里面成员函数int func(int p)原型在编译器看来是int func(T * const this, int p)this在成员函数的开始前构造结束后清除this指针因编译器的不同而有不同的放置位置可以是栈或者寄存器或者全局变量。类 与结构体相似 类的成员可以是变量也可以是函数通过类定义的变量叫做对象类可创建多个对象创建对象的过程叫类的实例化class 类名 { //类名首写字母大写public:公有数据private:私有数据protected:受保护数据}//左大括号 右大括号最后;分号结尾访问权限publ、prot、priv 也叫访问限定符不写关键字默认为priv栈中实例化对象-类名 变量名 变量名.成员名堆中实例化对象-类名 *指针名 new 类名 指针名-成员名 最后要用delete删除用来放置内存泄漏类产生的对象即变量名和指针名不能访问priv和prot成员只能访问publ构造函数创建对象时起作用析构函数 销毁时起作用 它们都定义在类里面 (~)类名();也可以将函数体定义在类外面即类名::(~)类名() 其中::是作用域符号构造函数和析构函数没有明确定义时创建对象时会默认生成一个空的。继承 基类派生类 允许用一个类定义另一个类公有继承派生类成员可访问publ和prot基类成员不能访问priva成员派生类对象只能访问publ成员保护继承基类各成员prot属性派生类成员可访问除priv成员之外的publ和prot成员派生类对象不可访问基类中的任何成员。私有继承基类各成员变为priv属性派生类成员可访问除priv成员之外的publ和prot成员派生类对象不可访问基类中的任何成员。函数重载函数同名参数和返回值不同一、C简介C 读作“C加加”是“C Plus Plus”的简称。“c”中的来自于 c 语言中的递增运算符该运算符将变量加 1。c起初也叫”c with class”。通过名称表明c是对 C 的扩展因此 c是 c 语言的超集这意味着任何有效的 c 程序都是有效的 c程序。c程序可以使用已有的 c 程序库。与 c 语言一样c也是在贝尔实验室诞生的Bjarne Stroustrup(本贾尼·斯特劳斯 特卢普)在 20 世纪 80 年代在这里开发了这种语言。C与C语言的编程对比C语言是一种面向过程的编程语言C是一种面向对象的编程语言。以下是C的一些标准我们为什么要了解这些标准比如C11就是在2011年发布的C的标准就是ISO/IEC 14882:2011Qt6开始支持C7的标准不同的C标准有不同的写法。二、Ubuntu C环境配置我们要在 Ubuntu 编写 C程序那么需要有能编写代码的文本编辑和 C编译器。在新装的 Ubuntu 环境里 编译 C 语言的 GCC 没有安装编译 C的 G也没有安装。执行下面的执指令安装编译 C 语言和 C的环境。sudo apt-get install gcc g sudo apt-get install lsb-core lib32stdc6 // 安装其他库安装完成后可以使用下面的指令来查看安装的 gcc 和 g的版本(安装完后要记得重新打开Qt才能生效)g -v gcc -v用Windows来开发Qt的话就不需要使用这些库。三、什么是类和对象C 中的类是一种构造类型与C语言的结构体相似但是进行了一些扩展类的成员不但可以是变量还可以是函数通过类定义出来的变量也有特定的称呼叫做“对象”。类是创建对象的模板一个类可以创建多个对象每个对象都是类类型的一个变量创建对象的过程也叫类的实例化。类的模板//类的定义 class 类名 { public: 公有的数据 protected: 保护的数据; private: 私有的数据 }; //类名的首写字母一般都是大写的 //左大括号 右大括号 还有分号不要漏了C通过public、protected、private三个关键字来控制成员变量和成员函数的访问权限它们分别表示公有的、受保护的、私有的被称为成员访问限定符。所谓访问权限就是你能不能使用该类中的成员。举个例子#include iostream using namespace std; class Dog { //不写关键字的时候就是private属性的 public: string name; int age; void run() { cout 狗会跑 endl; } //private: protected: double weight; }; int main() { //从栈中实例化对象 Dog dog1; dog1.name 旺财; dog1.run(); //dog1.weight 50.2;//因为是private/pteotected类产生的对象时访问不了它的 cout dog1.name endl; //从堆中实例化对象,要用delete删除(实际上不删除也是可以的在程序结束后系统会回收) //不过写程序的话是不会让它结束的因为程序在一直运行假设不删除的话指针会占着内存不放 //多个对象的话会造成内存泄漏所以还是要用delete删除 Dog *dog2 new Dog; dog2-age 3; cout dog2-age endl; delete dog2; cout Hello World! endl; return 0; }我们要注意这些1、类能创建多个对象 以及类的成员不仅可以是变量也可以是函数2、public类的实例化对象可以访问 protected/private类的实例化对象不可以访问。3、从栈中或者从堆中分别是怎么实例化对象的以及什么格式实例化对象的成员的区别在哪里还有一点堆中实例化对象的时候为什么delete删除它四、构造函数与析构函数定义了一个名称和类名相同没有返回值的函数这个函数称为构造函数。构造函数的特殊之处在于它会在类实例化的时候被调用。例如#include iostream class Dog { public: Dog(); };对象实例化的时候会调用构造函数而对象销毁的时候就会调用析构函数。例如#include iostream class Dog { public: ~Dog(); };综合上面两种格式这里方便理解举个例子说明#include iostream using namespace std; class Dog { public: Dog() { cout 构造函数被执行了! endl; }; ~Dog();//定义在里面也可以的这里定义在了外面 }; //::是作用域运算符 Dog::~Dog() { cout 析构函数被执行了! endl; } int main() { //Dog dog1;//这里从栈中实例化对象程序结束后会由系统回收该对象 Dog *dog1 new Dog; delete dog1; cout Hello World! endl; return 0; }这里我们要注意的是1、构造函数和析构函数在类中声明的函数体内容可以在类里也可以定义在外面2、留意作用域的符号以及使用方法3、找到 从栈中实例化和从堆中实例化时 构造函数和析构函数的执行底层都有什么不同?(可以通过执行上面的程序来分辨异同)在类实例化对象的时候如果没有定义构造函数则编译器会合成一个默认的构造函数当有了对象后如果没有定义析构函数则编译器会合成一个默认的析构函数。要明白这句话的含义五、类的继承重点内容要好好理解什么是基类和派生类创建新类时并不需要创建全新的数据和成员函数我们可以指明这个新类继承现有类的成员。此时现有的类称为“基类”继承实现的新类称为“派生类”。公有继承时基类中各成员属性保持不变基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员而不能访问private成员派生类的对象只能访问基类中的public成员。以下例子说明#include iostream using namespace std; //已有类叫基类也叫父类 class Animal { public: string name; int age; void run() { cout 狗的年龄: age endl; } private: double weight; protected: string color; }; //这个类是派生类也叫子类 class Dog : public Animal { public: void eat() { //this-weight 50.2;//这里会报错派生类的成员不能访问基类的private成员 this-name 旺财; //没有报错说明派生类的成员能访问基类的public成员 this-color 黑色;//没有报错说明派生类的成员能访问基类的protected成员 } }; int main() { Dog dog1; dog1.age 11; dog1.run(); return 0; }保护继承时基类中各成员属性均变为protected并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员而不能访问private成员派生类的对象不能访问基类中的任何的成员。举个例子#include iostream using namespace std; //已有类叫基类也叫父类 class Animal { public: string name; int age; void run() { cout 狗的年龄: age endl; } private: double weight; protected: string color; }; //这个类是派生类也叫子类 class Dog : protected Animal { public: void eat() { //this-weight 50.2;//这里会报错派生类的成员不能访问基类的private成员 this-name 旺财; //没有报错说明派生类的成员能访问基类的public成员 this-color 黑色;//没有报错说明派生类的成员能访问基类的protected成员 } }; int main() { Dog dog1; //dog1.age 11;//派生类的对象不能访问基类中的任何的成员 //dog1.run();//派生类的对象不能访问基类中的任何的成员 return 0; }私有继承时基类中各成员属性均变为private并且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员而不能访问private成员派生类的对象不能访问基类中的任何的成员。举个例子说明#include iostream using namespace std; //已有类叫基类也叫父类 class Animal { public: string name; int age; void run() { cout 狗的年龄: age endl; } private: double weight; protected: string color; }; //这个类是派生类也叫子类 class Dog : private Animal { public: void eat() { //this-weight 50.2;//这里会报错派生类的成员不能访问基类的private成员 this-name 旺财; //没有报错说明派生类的成员能访问基类的public成员 this-color 黑色;//没有报错说明派生类的成员能访问基类的protected成员 } }; int main() { Dog dog1; //dog1.age 11;//派生类的对象不能访问基类中的任何的成员 //dog1.run();//派生类的对象不能访问基类中的任何的成员 return 0; }六、函数重载在同一个作用域内声明几个功能类似的同名函数并且这些同名函数的参数个数、参数类型或者参数顺序不同或者函数返回类型不同那么就叫函数重载。例子一留意定义的函数是构造函数参数#include iostream using namespace std; class Dog { public: Dog(int weight) { cout int类型狗的体重 weight endl; } Dog(double weight) { cout double类型狗的体重 weight endl; } }; int main() { Dog dog1(50); Dog dog2(50.2); cout Hello World! endl; return 0; }例子二、留意定义的函数参数#include iostream using namespace std; class Dog { public: void getWeight(int weight) { cout int类型狗的体重 weight endl; } void getWeight(double weight) { cout double类型狗的体重 weight endl; } }; int main() { Dog dog1; dog1.getWeight(10); dog1.getWeight(10.2); cout Hello World! endl; return 0; }例子三、留意 函数不同的参数返回值#include iostream using namespace std; class Dog { public: void getWeight(string color, int weight) { cout int类型狗的体重 weight endl; } double getWeight(double weight) { cout double类型狗的体重 weight endl; return weight; } }; int main() { Dog dog1; dog1.getWeight(黑色, 10); dog1.getWeight(10.2); cout Hello World! endl; return 0; }最后要补充一些内容命名空间先看一个例子#include iostream using namespace std; int main() { cout Hello, World! endl; return 0; }代码的第二行就是使用命名空间。其中第一行注意不能写成 iostream.h 有.h 的是非标准的输入输出流 c 的标准库。无.h 的是标准输入输出流就要用命名空间。using 是编译指令 声明当前命名空间的关键词。可以理解成使用命名空间 std。因为 cin 和 cout 都是属于 std 命名空间下的东西所以使用时必须加上 using namespace std;这句话。 cin 和 cout 可以写 std::cin 和 std::cout“::”表示作用域 cin 和 cout 是属于 std 命名空间下的东西这里可以理解成 std 的 cin 和 std 的 cout。为什么要使用命名空间有些名字容易冲突所以会使用命名空间的方式进行区分具体来说就是加个前缀。比如C 标准库里面定义了 vector 容器 您自己也写了个 vector 类这样名字就冲突了。于是标准库里的名字都加上 std:: 的前缀 您必须用 std::vector 来引用。同理 您自己的类也可以加个自定义的前缀。但是经常写全名会很繁琐所以在没有冲突的情况下您可以偷懒写一句using namespace std;接下去的代码就可以不用写前缀直接写 vector 了。下面通过一个简单的例子来介绍自定义的命名空间和使用自定义的命名空间。#include iostream using namespace std; //自定义了命名空间A里面定义了一个变量x,并赋值为1还定义了一个函数fun() //并在 fun()加了输出打印语句 coutA namespaceendl;。 namespace A { int x 1; void fun() { coutA namespaceendl; } } using namespace A; //这是11行 声明使用命名空间 A int main() { fun(); //在第 11 行声明了命名空间 A 后 才能直接使用 fun();否则要写成 A::fun(); A::x 3; //将 A 命名空间下的 x 重新赋值为 3。 coutA::xendl; //打印出 A 命名空间下的 x 的值。 A::fun(); //调用 A 命名空间下的 fun()。 return 0; }编译完成之后的结果是
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenClaw:动态架构搜索驱动的智能代码生成框架 2026/9/15 12:12:49

OpenClaw:动态架构搜索驱动的智能代码生成框架

1. 项目概述:OpenClaw技术革命上周三凌晨三点,我在GitHub Trending榜发现一个标星暴涨的项目——OpenClaw。这个被开发者称为"龙虾钳子"的开源工具,正在以每天3000 star的速度刷新记录。作为经历过Spring Boot、React、Kubernetes等…

阅读更多 →
AI如何重塑半导体行业定价与供应链格局 2026/9/15 12:12:49

AI如何重塑半导体行业定价与供应链格局

1. 半导体行业价格波动背后的AI驱动力最近半年,全球半导体市场正在经历一场前所未有的价格普涨。从晶圆代工到存储芯片,从功率器件到传感器,各类半导体产品的报价单上几乎都出现了两位数以上的涨幅。作为一名在芯片行业摸爬滚打十余年的从业者…

阅读更多 →
数字统计教学工具:可视化与多模态反馈设计 2026/9/15 12:12:49

数字统计教学工具:可视化与多模态反馈设计

1. 项目概述:数字统计的直观教学工具这个手动步进演示工具是我在数学教学过程中开发的一套可视化统计系统,专门用于讲解数字各位出现次数的统计原理。它通过物理操作和视觉反馈,让学习者能够亲手体验数字分解和统计的全过程,特别适…

阅读更多 →
CIC数字下变频抽取滤波器:从MATLAB建模到FPGA实现 2026/9/15 12:12:49

CIC数字下变频抽取滤波器:从MATLAB建模到FPGA实现

简介:面向数字信号处理学习者的DDC(数字下变频)CIC滤波器实现资料,聚焦利用CIC积分梳状滤波器完成射频/中频信号到基带的变频处理,涵盖MATLAB脚本、Simulink模型及VHDL源码,适合通信、雷达等方向学生与工程…

阅读更多 →
Windows下Redis注册为系统服务完整指南:开机自启与崩溃自动拉起 2026/9/15 12:12:49

Windows下Redis注册为系统服务完整指南:开机自启与崩溃自动拉起

作为常年混迹在 Windows 环境下的开发者,Redis 这东西多半是你先拿 Docker 或者 WSL 里跑着玩,等真到了做本地开发、搭缓存、跑测试环境的时候,你一定会遇到那个经典场景:双击redis-server.exe,窗口是弹出来了&#xf…

阅读更多 →
NocoBase create-nocobase-app 安装升级指南:从 `yarn nocobase upgrade` 到指定版本升级的完整实战 2026/9/15 12:09:49

NocoBase create-nocobase-app 安装升级指南:从 `yarn nocobase upgrade` 到指定版本升级的完整实战

NocoBase create-nocobase-app 安装升级指南:从 yarn nocobase upgrade 到指定版本升级的完整实战 【免费下载链接】nocobase NocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratc…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞