自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 问答 (2)
  • 收藏
  • 关注

原创 QT信号和槽初学案例

假设一个案例下课后老师饿了,学生请老师吃饭老师为信号的发送者,学生为信号接收者就是槽创建两个类老师类和学生类老师类.h头文件如下:在老师类头文件signals:下写信号饿了函数不需要在老师.cpp源文件下写实现#ifndef TEACHER_H#define TEACHER_H#include <QObject>class Teacher : public QObject{ Q_OBJECTpublic: explicit Teacher(QObjec

2021-04-29 21:20:19 232

原创 类分文件编写

设计圆类案例点类头文件:放成员函数声明和成员变量#pragma once#include<iostream>using namespace std;class Point {public: void setX(int x); int getX(); void setY(int y); int getY();private: int m_X; int m_Y;};点类源文件:放成员函数定义#include"Point.h"void Point::setX(in

2021-04-24 20:47:50 150

原创 成员函数和全局函数调用的区别

这段代码的关键在于了解成员函数和全局函数调用的区别#include <iostream>using namespace std;class Cube{public: void setM_H(int h) { m_H = h; } int getM_H(){ return m_H; } void setM_L(int l) { m_L = l; } int getM_L() { return m_L; } void setM_W(int w) { m

2021-04-24 20:21:57 368

原创 C++ class访问权限

父类也叫基类,子类也叫派生类公共权限public:类外也可访问保护权限protected:类外不可访问,子类可以访问私有权限private:类外不可以访问,子类不能访问#include <iostream>using namespace std;class Person {public: string m_Name;//名字protected: string m_Car;//车private: int m_Password;//银行卡密码 void func() {

2021-04-21 22:18:02 386

原创 C++ primer 7.1定义抽象数据类型

struct Sales_data { std::string isbn() const { return bookNo; } Sales_data& combine(const Sales_data&); double avg_price()const; std::string bookNo; unsigned units_sold = 0; double revenue = 0.0;};Sales_data add(const Sales_data&, c

2021-04-20 21:28:52 122

原创 C++ primer 6.7函数指针

函数指针指向的是函数而非对象要想声明一个指向该函数的指针,只需要用指针替换函数名即可函数指针的小括号必不可少bool lengthCompare(const string&, const string&);//将这个函数写成指针bool (*pf)(const string&, const string&);//未初始化//pf指向一个函数,该函数的参数是两个const string 的引用,返回值是bool类型//如果没有小括号bool *pf(const s

2021-04-17 16:20:46 85

原创 C++ const关键字

1、定义const常量int main(){const pi = 3.14;//pi = 3.14159; 报错定义了const常量后其值不可更改return 0;}2、const 和指针两种情况1、常量指针:不能通过指针修改指针指向的变量的值,但是指针可以指向别的变量int i = 5;const int *a = &i//*a = 20;此处报错不可修改指针所指向变量的值int j = 10;p = &j;//正确指针可以指向别的变量2、指向常量的指针(

2021-04-16 17:23:16 71

原创 C++primer 6.6.1实参类型转换

实参类型到形参类型的转换优先级从上到下1 精确匹配形参和实参类型相同数组转指针有无顶层const2 const 转换成需要的匹配3 通过类型提升实现转换4 通过算术类型转换或指针转换5 通过类类型转换练习6.52(a)manip('a','z')//此为类型提升将char类型转化为int(b)manip(55.4,dobj)//此为算术类型转化,将double转化为int练习6.53int calc(int&, int&) { return 0;}int

2021-04-02 10:31:05 114

原创 C++ primer 6.6函数匹配

候选函数:函数匹配的第一步是选定本次调用的重载函数集,集合中的函数被称为候选函数根据实参情况,从候选函数中挑选出能被这实参调用的函数,此次选出的函数被称为可行函数。函数匹配:重载函数调用时的选择。练习6.50:根据实参匹配情况(a):不合法,42为int(b):合法©: 合法(d):合法练习6.51:#include <iostream>using namespace std;void f() { cout << "调用void f()" <&lt

2021-03-28 10:59:56 81

原创 C++ primer 6.5.3调试帮助

assert预处理宏assert是一种预处理宏,预处理宏就是一个预处理变量,它其实有点像内联函数,assert宏用一个表达式作为它的条件assert(expr)如果assert(expr为假)assert输出信息并终止程序的执行,如果expr为真则assert什么都不做使用assert需包含cassert头文件NEDBUG预处理变量assert的行为依赖于一个名为NEDBUG的预处理变量的状态如果定义了NEDBUG则assert什么也不做可以用#define 语句定义NEDBUG从而关闭调试

2021-03-28 10:19:39 103

原创 C++ primer 6.5.2内联函数和constexpr函数

内联函数可避免函数调用的开销#include <iostream>using namespace std;inline int sum(int a, int b) { return a + b;}int main(){ cout << sum(1, 2) << endl; //内联函数其调用过程等同于以下代码 //cout << a + b << endl; //从而消除了函数运行时的开销 system("pause"

2021-03-27 09:02:35 134

原创 C++ primer 6.5.1默认实参

函数可以有默认实参当需要使用默认实参时,在调用函数时省略该实参就可以了当某个形参赋予了初始值,那么它后面的所有形参都要赋予初始值int func(int a , int b = 2, int c = 3) {//后面的形参必须初始化前面的可以不初始化 return a + b + c;}int main(){ cout << func(1) << endl;//func(1)等同于是func(1,2,3) cout << func(1,10) &lt

2021-03-24 08:17:20 124

原创 C++ primer 6.4.1重载与作用域

如果函数外部与函数内部有同名函数,在函数内部调用这个函数,外部函数会被隐藏,调用的是内部的同名函数函数调用时,编译器会先找局部的哪个函数,一旦找到了对应名字的函数,编译器会忽略外部的同名函数在C++中名字查找发生在类型检查之前string read();void print(const string&);void print(double);void fooBar(int ival) { bool read = false;//这个read在fooBar作用域内 string s =

2021-03-20 21:21:28 54

原创 C++ primer 6.4函数重载

如果同一作用域内函数名相同但形参列表不同,称之为函数重载在调用时编译器会根据传入的实参类型判段调用的是哪个函数main函数不能被重载#include<string>#include <iostream>using namespace std;void print(int i) { cout << i << endl;}void print(string i) { cout << i << endl;}void p

2021-03-19 19:44:29 126

原创 C++ primer 6.3.3返回数组指针

函数不能返回数组,但能返回数组的指针或引用想要定义一个返回数组的指针或引用的函数比较繁琐,可以用类型别名的方法typedef int arrT[10];//arrT是一个类型别名,它表示的类型是含有10个整数的数组using arrT = int[10];//arrT的等价声明arrT* func(int i);//func返回一个指向含有10个整数的数组的指针 要想不使用类型别名的方法声明一个返回数组指针的函数,就必须牢记区分被定义的名字后面数组的维度 int arr[10];//arr是一

2021-03-18 20:09:59 108

原创 C++ primer 6.3返回类型和return语句 && 6.3.1无返回值函数 &&6.3.2有返回值参数

return语句终止当前正在执行的函数,并将控制权返回到调用该函数的地方return;//没有返回值的一般用在返回值类型void的函数中,可以不写,这种函数会隐式的执行returnreturn 表达式;//返回函数的结果,除开void函数,其他返回值类型函数都必须返回一个值,并且return的返回值类型必须与函数返回值类型相同,或者能够隐式的转换为相同的类型void swap(int& a, int& b) { if (a == b) { return;//如果a=b那么直接退

2021-03-17 21:52:08 194

原创 C++ primer 6.2.6 含有可变形参的函数

C++有一种特殊的形参类型(即省略符),可以用它传递可变数量的形参,这种功能一般用于与C函数交互的接口程序。initializer_list 形参如果实参数量未知,但全部实参类型相同,就可以使用initializer_list类型的形参(使用时需包含同名头文件)定义initializer_list对象时,必须说明列表中所含元素的类型例如 initializer_list<string>lst;//initializer_list的元素是string类型 initializer_li

2021-03-16 22:01:56 116

原创 C++ primer 6.2.5 main:处理命令行选项

一般情况下我们定义的main函数都是空形参列表但有些情况下需要给main传递形参练习6.25使用argv中的实参时,可选参数应该从argv[1]开始,argv[0]保存的是程序的名字#include<string>#include <iostream>using namespace std;int main(int argc,char **argv){ string s = ""; for (int i = 0; i < argc; i++) { s

2021-03-16 20:45:38 95

原创 C++ primer 6.2.4 数组形参

数组形参当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针数组形参不能以值传递的方式传递数组以下三种写法等价,每个函数唯一的形参都是const int *void print(const int *)void print(const int[])void print(const int[10])当传入一个数组给print函数,实参会自动地转换为指向数组首元素的指针使用数组形参时,必须确保使用数组时不会越界管理指针形参,常用的3种技术使用标记指定数组长度void print

2021-03-15 22:31:05 172

原创 C++ primer 6.2.3 const形参和实参

顶层const作用与对象本身const int ci = 42;//不能改变ci,const是顶层的int i = ci;//正确:当拷贝ci 时,忽略了它的顶层const(就是说顶层const所指对象可以拷贝但不可以改变)//ci = 43;报错int *const p = &i;//const是顶层的,不能给p赋值(此时const修饰的 int *,即p是地址别名)//int *const p = 2;不能给p赋值//所以*p = 0;//可以用p去修改i的值所以当形参有顶层c

2021-03-15 01:05:13 110

原创 C++ primer 6.2.2传引用参数

传引用参数引用的本质就是起别名,当对引用绑定的别名操作时,其实操作的是被引用的对象int i = 0;int &r = i;r = 10; //此时 i等于10void reset(int &i){ int i = 0;}int main(){int j = 20;reset(j); // 函数过程为:j = 20, i是j的别名,i = 0 ,那么j的值也变为了0cout<<"j = "<< j <<endl;}使用 引用

2021-03-12 04:13:33 85

原创 C++ primer 6.2.1传值参数

传值参数当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时对变量的改动不会影响初始值int n = 0;//int 类型的初始变量int i = n;//拷贝n赋值给ii = 42;//此时 i = 42,n的值不变传值参数原理完全一样,函数形参的所有操作都不会影响到实参int func(int x){return x+=x;}int main(){int a = 5;cout<<func(a)<<endl;//调用了函数之后值变为10cout&l

2021-03-12 02:56:12 66

原创 C++ primer 6.2参数传递

6.2参数传递调用函数时会重新创建它的形参,并用实参进行初始化伪代码:void func(int x){…}func(5) 调用func并传入实参5,这个过程等同于 形参 int x = 5当实参的值拷贝给形参时,形参和实参是两个独立的对象,我们说这样的实参被值传递也可以说是函数被传值调用形参的类型决定了形参和实参的交互方式(形参是什么类型,传入的实参应该是什么类型)#include<string>#include <iostream>using namesp

2021-03-11 03:14:48 72

原创 C++ primer 6.1.3分离式编译(分文件编写)

6.1.3分离式编译(分文件编写)分离式编译就是把程序分割成几个文件,每个文件独立编译6.9节练习:Chapter6.h#pragma once //防止头文件重复包含int fact(int val);//声明函数fatc.cc#include"Chapter6.h" //包含头文件int fact(int val) {//函数定义 int ret = 1; while (val > 1) { ret *= val--; } return ret;}fa

2021-03-11 02:10:57 282

原创 C++ primer 6.1.2 函数声明

6.12函数声明函数只能定义一次但是可以声明多次函数声明和函数定义区别在于,函数声明没有函数体,函数声明可以省略形参,但写上形参更利于阅读理解。在实际开发中,函数声明一般写在头文件中(.h头文件)。这样写更规整,方便后期更改。定义函数的源文件要包含声明函数的头文件,编译器会验证函数的声明和定义是否匹配练习题6.8头文件:#pragma once //防止头文件重复包含int fact(int val);//函数声明//源文件:#include<iostream>

2021-03-11 01:05:27 122

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除