
C++
文章平均质量分 70
C++
有趣的我
菜鸡逐梦IT圈
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
effective c++---别让异常逃离析构函数
在C++中,从析构函数抛出未捕获的异常会导致程序崩溃(直接调用std::terminate)。// ❌ 致命错误!std::fstream:析构调用close(),但关闭错误仅设置failbit,不抛出。file.close()) { // 假设close()可能抛出异常。void close() { // 用户主动调用,可处理异常。// 必须确保close()不抛出。// 若析构函数抛出异常,程序直接终止,无法到达这里。提供close()/release()等方法。// 可安全抛出(但通常仍不建议)原创 2025-07-14 16:50:01 · 254 阅读 · 0 评论 -
Effective C++之定义式和声明式
定义式的作用是为编译器提供声明式(declaration)所缺失的详细信息,使得编译器能够正确生成代码或分配内存。定义式(Definition):提供声明所缺失的细节,使得编译器可以实际使用该名称(分配内存、生成代码等)。std::size_t numDigits(int number) { // 定义式:提供函数体。声明式仅告诉编译器“这是什么”,而定义式告诉编译器“这是什么以及如何实现/分配”。// 定义式:编译器为 x 分配内存。class Widget { // 定义式:列出类的成员。原创 2025-07-14 10:46:55 · 257 阅读 · 0 评论 -
回调函数和工厂模式和中断
回调函数和工厂模式可以结合使用,以实现灵活的对象创建和动态行为。它使用工厂模式创建产品,并在创建成功后调用回调函数。在 main 函数中,调用 performAction 并传入不同的产品类型和相应的回调函数,以执行特定操作。解耦:工厂模式和回调函数的结合使得对象创建和行为定义分离,增强了代码的可维护性和可扩展性。灵活性:通过回调函数,客户端可以定义如何使用创建的对象,而不需要修改工厂或产品的实现。动态对象创建:使用工厂模式创建不同类型的对象。// 使用回调函数定义操作。原创 2025-01-07 17:20:21 · 463 阅读 · 0 评论 -
QT学习ubuntu qt + desktop
可以在帮助文档中搜索,发现它的父类和子类。父类需要包含到头文件中。原创 2024-08-29 17:08:21 · 717 阅读 · 0 评论 -
类和对象—友元—全局函数做友元
友元的目的是让一个函数或者一个类可以访问另一个类中的私有成员。友元的关键字为friend友元的三种实现全局函数做友元类做友元成员函数做友元1、全局函数做友元#include <iostream>#include <string>using namespace std;class Building{ //goodGay全局函数是 Building的好朋友 , 可以访问Building中的私有成员 friend void goodGay(Building原创 2020-12-18 16:48:05 · 336 阅读 · 2 评论 -
类和对象—对象特性—const修饰成员函数
常函数:成员函数后加const后我们称这个函数为常函数常函数内不可以修改成员属性成员属性声明时加关键词mutable 后在常函数中依然可以修改常对象声明对象前加 const称该对象为常对象常对象只能调用常函数案例#include <iostream>using namespace std;class Person{public: //this指针的本质是指针常量,指针的指向不可以修改。在函数的后面加了const之后 等价于 const Person * cons原创 2020-12-18 16:18:15 · 245 阅读 · 1 评论 -
类和对象—对象特性—空指针访问成员函数
空指针无指向的实体,因此无法访问对象的成员。#include <iostream>using namespace std;class Person{public: void showClassName(){ cout << "showClassName" << endl; } void showPersonAge(){ // if(this == NULL){ return; } cout << "person的ag原创 2020-12-18 15:57:34 · 146 阅读 · 1 评论 -
类和对象——对象特性——this指针的用途
在C++中成员变量和成员函数是分开存储的。每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分是哪个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所指向的对象。this指针是隐含在每一个非静态成员函数的一种指针this指针不需要定义,直接使用即可。this指针的用途当形参和成员变量同名时,可用this指针来区分class Person{public: Person原创 2020-12-18 15:45:43 · 260 阅读 · 0 评论 -
STL基本概念
STL基本概念1、STL——standard template library 标准模板库2、STL从广义上分为:容器(container) 算法(algorithm)迭代器(iterator)3、容器和算法通过迭代器进行无缝连接。4、STL几乎所有的代码都采用模板类或者模板函数STL六大组件STL大体分为6大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器1、容器:各种数据结构,如vector、list、deque、set、map等用来存放数据。2、算法:各种常用的算法,如s原创 2020-12-18 10:32:37 · 289 阅读 · 0 评论 -
类和对象—多态
多态的基本语法静态多态:函数重载和运算法重载属于静态多态 复用函数名动态多态:派生类和虚函数实现运行时多态静态多态和动态多态的区别静态多态的函数地址早绑定,编译阶段确定函数地址动态多态的函数地址晚绑定,运行阶段确定函数地址早绑定代码如下:#include <iostream>using namespace std;class Animal{ public: void speak(){ cout << "动物在说话"<< endl;原创 2020-12-17 17:52:29 · 145 阅读 · 0 评论 -
类和对象—继承—同名成员处理
静态同名成员和非静态同名成员静态同名成员: 1、通过对象访问 2、通过类名访问#include <iostream>using namespace std;class BaseClass{ public: BaseClass(){ m_A = 100; } int m_A; void func(){ cout << "BaseClass void func " << endl; } //静态 static in原创 2020-12-17 17:15:06 · 264 阅读 · 0 评论 -
成员函数和成员变量分开存储
1 Person类为空class Person{ };sizeof(Person)结果为12 Person如下class Person{ public: int m_A; //非静态成员变量 属于类对象上 static int m_B; //静态成员变量 不属于类对象上 void func(){} //非静态成员函数 不属于类对象上 static void func2(){} //静态成员函数 不属于类对象上 };sizeof(Person)结果为4 ,由此可知只有原创 2020-12-17 14:05:46 · 179 阅读 · 0 评论 -
类和对象—继承
继承方式public、protected、private属性权限:public:类内类外都可以访问protected:类内可以访问,类外访问不了private:类内可以访问,类外访问不了自己的理解如下:可以将A类中的属性的访问的领域分为A类、B类(继承于A)和类外A类中的属性A类都可以访问B类和类外都可访问:publicB类和类外都不可访问:privateB类可以访问,类外不可访问:protected代码如下:#include <iostream>using nam原创 2020-12-17 12:42:13 · 233 阅读 · 0 评论 -
类和对象—对象特性—静态成员函数
静态成员函数所有对象共享同一个静态成员函数静态成员函数只能访问静态成员变量#include <iostream>using namespace std;class Person{public: static void func(){ m_A = 100; //静态成员函数可以访问静态成员变量 // m_B = 200; //静态成员函数不可以访问非静态成员变量 无法区分到底是哪一个对象的 m_B cout << "static void func原创 2020-12-17 10:25:53 · 189 阅读 · 0 评论 -
静态成员变量
静态成员变量所有对象共享同一份数据(一个改了另外一个访问的就是改后的数据)在编译阶段分配内存(全局区)类内声明,类外初始化#include <iostream>using namespace std;class Person{public: static int m_A; //静态成员变量也是有访问权限的 private: static int m_B;};int Person::m_A = 100;int Person::m_B = 200;void te.原创 2020-12-16 20:48:16 · 162 阅读 · 1 评论 -
类和对象—对象特性—深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作深拷贝:在堆区重新申请空间,进行拷贝操作#include <iostream>using namespace std;class Person{public: //构造函数 Person(){ cout << "Person 无参构造函数的调用!" << endl; } Person(int age,int height){ m_Height = new int(height); m_Age = age;原创 2020-12-16 17:25:52 · 152 阅读 · 0 评论 -
类和对象—对象特性—构造函数调用规则
默认情况下,C++编译器至少给一个类添加三个函数默认构造函数(无参,函数体为空)默认析构函数(无参,函数体为空)默认拷贝构造函数,对属性进行值拷贝构造函数调用规则如下:如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造如果用户定义拷贝构造函数,C++不再提供其他构造函数#include <iostream>using namespace std;//按照参数分类 有参构造(默认构造) 无参构造 //按照类型分类 普通构造 拷贝构造 cla原创 2020-12-16 16:41:05 · 159 阅读 · 0 评论 -
类和对象—对象特性—拷贝构造函数调用时期
C++中拷贝构造函数通常有三种情况使用一个已经建立完毕的对象来初始化一个新对象值传递的方式给函数参数传值以值方式返回局部对象#include <iostream>using namespace std;//按照参数分类 有参构造(默认构造) 无参构造 //按照类型分类 普通构造 拷贝构造 class Person{public: //构造函数 Person(){ cout << "Person 无参构造函数的调用!" << endl;原创 2020-12-16 16:17:16 · 160 阅读 · 0 评论 -
类和对象—对象特性—函数的分类和调用
构造函数的分类及调用两种分类方式:按参数分类分为:有参构造和无参构造按类型分类分为:普通构造和拷贝构造三种调用方式括号法显示法隐式转换法匿名对象特点:当前行执行结束后,系统会立即回收掉匿名对象Person类:class Person{public: //构造函数 Person(){ cout << "Person 无参构造函数的调用!" << endl; } Person(int a){ age = a; cout <<原创 2020-12-16 15:37:44 · 223 阅读 · 0 评论 -
类和对象—对象特性—构造函数和析构函数
对象的初始化和清理电子产品的出厂设置以及不用的数据的清理C++每个对象都有数据的初始化操作和数据清理的设置构造函数和析构函数这两个函数是由编译器自动调用的,可以不写构造函数语法:类名(){} 注:必须写作用域public构造函数,没有返回值也不写void函数名和类名相同可以有参数,因此可以发生重载编译器自动调用且只调用一次析构函数语法:~类名(){}析构函数,没有返回值也不写void函数名和类名相同,在前面加上~析构函数不可以有参数,因此也不可以发生重载程序在对象销原创 2020-12-16 14:58:39 · 168 阅读 · 0 评论 -
设计案例——点和圆的关系
point.h#pragma once#include <iostream>using namespace std;//点类 x y class Point{public: //设置x void setX(int x); //获取x int getX(); //设置y void setY(int y); //获取y int getY();private: int m_X; int m_Y;};point.cpp #include "point.h"原创 2020-12-16 13:59:30 · 356 阅读 · 0 评论 -
类和对象——封装
封装是C++面向对象三大特性之一封装的意义:将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制#include <iostream>using namespace std;const double PI = 3.14;//class表示要设计一个类,类后面紧跟着的就是类名称 class Circle{ //访问权限public: //属性 //半径 int m_r; //行为 //获取圈的周长的函数 double calculat原创 2020-12-15 16:09:40 · 205 阅读 · 0 评论 -
C++函数高级
默认参数注意事项:(1)如果某个位置已经有了默认参数,那么从这个位置往后,从左往右都必须有默认值int func(int a,int b = 10,int c = 20){ return a + b + c;}//一旦函数的某个参数有了默认值,那么该参数的后面的参数也必须给它们默认值(2)如果函数的声明有了默认参数,那么函数的实现就不能有默认参数了。声明和实现只能有一个有默认参数。不然有二义性。#include <iostream>using namespace std.原创 2020-12-15 15:23:10 · 207 阅读 · 1 评论 -
C++中的引用
原理与语法原理语法#include <iostream>using namespace std;int main(){ int a = 10; int &b =a; cout << a << endl; cout << b << endl; b = 20; cout << a << endl; cout << b << endl; return 0;} .原创 2020-12-15 11:16:49 · 130 阅读 · 0 评论 -
程序的内存模型—new运算符
new一个变量并deleteint *p=new int(10);delete p;new一个数组并deleteint *arr = new int[10];//new一个int型数组返回的是指向数组的首地址的int型指针delete [] arr;//因为是delete的是一个数组,所以中间要添加中括号...原创 2020-12-15 10:16:27 · 167 阅读 · 0 评论 -
程序的内存模型—内存四区—堆区
#include <iostream>using namespace std;//栈区的数据程序执行完之后就释放。用指针指向某数据,但是函数指向完,该指针指向的位置的内容已经被释放。//所以不要返回局部变量的地址 !!!int * func1(){ int a=10; return &a;}//用new产生的数据是被放在堆区的,由程序员自行管理。 指针是在栈上的,它指向的值是放在堆区的。//因此函数执行后堆区的数据也不会被释放。直到整个程序运行完毕 (关闭弹出exe窗原创 2020-12-14 17:53:23 · 361 阅读 · 0 评论