首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++学习:从基础到QT实现

C++学习:从基础到QT实现

作者头像
天天Lotay
发布于 2022-11-11 10:20:42
发布于 2022-11-11 10:20:42
84700
代码可运行
举报
文章被收录于专栏:嵌入式音视频嵌入式音视频
运行总次数:0
代码可运行

day1

C++: C语言内容(不专门讲解)

​ c++基于c语言的扩展, 头文件, 文件后缀, 编译, 输入输出,堆内存,引用,命名空间,函数

​ 类与对象, 封装, 继承,多态

​ IO流,友元, 运算符重载 ,静态数据, 常量,

​ 模板STL,C++11新特性(auto, lambda,智能指针)

C++开发平台

window–vs2017, vs2019,qtcreator ,g+±-vscode

C++基于c的扩展

第一个c++程序

1-第一个c++程序.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
int main(int argc, char **argv)
{
	std::cout<<"第一个c++程序"<<std::endl;
	return 0;
}

编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ -o main 1-第一个c++程序.cpp 

运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gec:$./main
第一个c++程序

从第一个c++程序可以看出与c不同:

1.后缀

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.h,  .cpp,  .cc,  .hpp,  .cxx

2.头文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream> 
c++标准输入输出iostream对应c里面stdio.h
c++标准库头文件是不带.h
在c++语言中使用标准c库,
	1.比如#include <stdio.h> --->#include <cstdio>
	2.在c++中使用非标准库
	extern "C"
	{
		#include "lcd.h"
	}

3.输入输出

输入cin, 输出cout,在c++里面已经定义好,不需要自己定义,直接可以使用

在使用的时候前面要添加一个std::

比如:输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a=0; double b;  char c[8];
std::cin >> a;  
std::cin >> a >> b >> c;

比如:输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int  a=123; double b=23.5; char c[8]="hello";
std::cout << a <<std::endl;  //这里的std::endl就相当于换行
std::cout<<a<<"  "<<b<<" "<<c<<std::endl;

注意:默认cout,cin只能对基本数据类型,和字符串输入输出,其他自定义类型需要自己重载输出输入运算符

练习:

用c++的输入输出实现学生数据初始化和显示学生信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

struct  Student{
	int age;
	char name[32];
	int number;
};

int main(void)
{
    struct Student Jack;
    std::cout<<"请输入学生信息(name age number):";
    std::cin>>jack.name>>jack.age>>jack.number;
    std::cout<<"name:"<<jack.name<<std::endl;
    std::cout<<"age:"<<jack.age<<std::endl;
    std::cout<<"number:"<<jack.number<<std::endl;
    return 0;
}

运行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gec:$./main 
请输入学生信息(name age number):jack 19 1001
name:jack
age:19
number:1001

在c++中使用c库函数

  1. 标准c库函数 直接可以用c++里面自带的头文件比如, cstdio, cstdlib, cstdbool
  2. 非标准c库函数

自定义的库函数比如:calc.h, calc.c

calc.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef _CALC_H
#define _CALC_H
int add(int a, int b);
int sub(int a, int b);
#endif

calc.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "calc.h"
int add(int a, int b)
{
	return a+b;
}
int sub(int a, int b)
{
	return a-b;
}

main.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include "calc.h"
int main(void)
{
	int a=0,b=0;
	std::cin>>a>>b;
	int c = add(a,b);
	std::cout<<c<<std::endl;
	return 0;
}

编译:当有c语言源代码可以直接编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ main.cpp calc.c  -o main   #有c源代码的时候添加头文件不能用extern "C"{#include"calc.h"}

编译:当没有c语言源代码只有c的库

1.把c语言源代码编译成库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -o libcalc.so -shared -fPIC calc.c

2.编译c++程序使用c库

要修改main.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
extern "C"   //表示里面的函数是c语言编写并且已经编译成库
{
	#include "calc.h"
}
int main(void)
{
	int a=0,b=0;
	std::cin>>a>>b;
	int c = add(a,b);
	std::cout<<c<<std::endl;
	return 0;
}

现在文件如下:

calc.h libcalc.so main.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ -o main main.cpp  -L./  -lcalc  
#-L后是库所在的路径, -l后面接库名  ,比如libcalc.so库名就是calc

指针堆内存

指针定义:指针就是地址(内存的编号),32位系统–32位, 64位系统—64位

指针变量:用来存储地址的变量,这个变量占用空间是4字节(32位机器)或8字节(64位机器)

指针变量定义:

数据类型 *变量名称 = 地址;

int *ptr = 0x12345678; //错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3-c++指针.cpp:6:13: error: invalid conversion from ‘int’ to ‘int*[-fpermissive]
  int *ptr = 0x12345678;
             ^

注意:指针在赋值的时候必须保证类型一致

如果实现上面ptr赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int  *ptr =  (int *)0x12345678;

堆内存分配

C语言中

申请堆空间malloc, calloc, realloc, 释放堆空间 free

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char  *str  = (char*)malloc(100);
free(str);
C++语言中

用new来申请堆空间, delete释放空间

申请堆空间格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
数据类型   *变量名称   =   new   数据类型;  //申请一个对象
数据类型   *变量名称   =   new   数据类型[n]; //申请n个对象

释放对空格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete  变量名称;
delete  []变量名称;

例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char  *astr  =  new  char; //申请一个char对象
	delete  astr;

char  *bstr  =  new  char('a');//申请一个char对象并且初始化为a
	delete  bstr;

char  *cstr  =  new  char[100];//申请100个char对象
	delete []cstr;

int   *dint  =  new  int; //申请一个int对象
	delete dint;

new == malloc + 构造函数

delete == free + 析构函数

练习:

申请4字节的堆空间, 从终端输入数据初始化空间值, 在用char *str 指向堆空间, 并且把空间中的每一个字节数据输出(整型数)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <cstdio>
int main()
{
	#if 0
	int *ptr =  new int;
	std::cin>>ptr[0];  //*ptr==ptr[0];
	char *str  =  (char*)ptr;
	for(int i=0; i<4; i++)
	{
		  printf("%d\t", str[i]); //std::cout<<(int)str[i]<<std::endl;
	}
	delete ptr;
	#endif
	int *ptr = new int;
	std::cin>> std::hex >>ptr[0];
	char *str  =  (char*)ptr;
	for(int i=0; i<4; i++)
	{
		std::cout<< std::hex <<(int)str[i]<<std::endl;
	}
	delete ptr;
}

命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Z0F1rlF-1652796910004)(day1.assets/image-20220427165633744.png)]

命名空间作用:名字冲突(函数,变量,类)

定义:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namepace  名称{
	变量, 函数, 类
};
例子:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace  A
{
	int data;
	void  showA()
	{
		cout<<data<<endl;
	}
}

namespace  B
{
	int data;
	void  showA()
	{
		cout<<data<<endl;
	}
}
使用命名空间
第一种方法

空间名称::成员名 (推荐写法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(void)
{
	std::cin>>B::data>>A::data;
	A::show();
	B::show();
}
第二种方法

using指引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using namespace  B;  //using指引
using namespace  std;
int main(void)
{
	cin>>data>>A::data;
	A::show();
	show();
}
第三种用法

using 声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using namespace  std;
using B::data;  //using声明
int main(void)
{
	cin>>data>>A::data;
	A::show();
	B::show();
}
空间嵌套
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace  AAA
{
	int dataA;
	namespace BBB{
		int dataB;
		namespace CCC{
			int dataC;
		}
	}
}
访问:
    直接通过空间名称访问
    AAA::dataA;
    AAA::BBB::dataB;
	AAA::BBB::CCC::dataC;
    用using指引
   	using namespace AAA; 可以直接访问dataA
    using namespace AAA::BBB; 可以直接访问dataB
    using 声明
    using AAA::BBB::dataB;
同名空间

file1.h文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace AAA{
	int dataA;
}

file2.h文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 namespace AAA{    
     int dataB;
 }

file1.h和file2.h文件中的AAA空间是同一个

匿名空间

没有名字的空间,空间中的成员可以在本文中直接使用,不能在其他文件中使用相当与c里面的static修饰

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace{
	int  data;
    int  number;
}

int main(void)
{
    data = 123;
}

作业

1、简述C++中命名空间的作用。

2、 定义两个命名空间A 和 B 分别在A中和B中定义变量value

在main函数中将两个空间的value打印出来。

3、const int a; 在C++编译器中是否需要初始化,为什么?

4、在c++中怎么使用c库函数

5、c++的常用后缀有那些?

6、说下命名空间的中匿名空间的作用, 以及与c语言中的static的异同

7、结合c++中堆空间分配,测试下系统中最大可以分配多少字节的堆空间

8、根据学过的内容编写一个程序计算栈的开始位置(大概位置)—笔试题目

9、读下面程序是否有问题如果有指出改正,并且输出结果是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char *&get_mem(int size) 
{ 
    char *ptr = new char[size];
    return ptr; 
}
 char *req_mem(int size) 
{ 
    char ptr[size];
    return ptr; 
} 
int main() 
{ 
    char *&ptr = get_mem(100);
    const char *p = "hello world";
    memcpy(ptr,p,strlen(p));
    cout<<ptr<<endl; 
   
    char *mptr = req_mem(100); 
    memcpy(mptr,p,strlen(p));
    cout<<mptr<<endl;
} 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Moment.js常见用法
用户4396583
2024/07/24
6840
Vue3项目-生成Cron表达式组件
  最近做的一个vue3项目过程中,需要用到cron表达式功能,而对于普通业务人员,他们是不懂cron表达式规则的,所以需要做一个可手动配置生成cron表达式的功能。从网上查找了一些相关资料,然后结合vue3+Element Plus,改造成适合自己项目的组件。记录代码如下:
用户1174387
2022/12/18
6.1K9
Vue3项目-生成Cron表达式组件
mysql时间按小时格式化_mysql时间格式化,按时间段查询的MySQL语句[通俗易懂]
下表显示了type和expr参数怎样被关联:type值 含义 期望的expr格式SECOND秒SECONDS
全栈程序员站长
2022/07/28
7.6K0
GitLab 14 轻量化运行方案
前不久分享了关于最新版本的 GitLab 的试用体验,《试用 GitLab 14 以及中国发行版:极狐》。
soulteary
2021/07/14
5.2K2
Vue学习笔记之moment.js日期处理控件
moment可以方便的计算自然月或者自然年份,避免使用固定天数或者月份计算导致结束日期错乱问题。
Jetpropelledsnake21
2022/11/12
13.9K0
Vue学习笔记之moment.js日期处理控件
细节、MYSQL_DATE_FORMAT()_函数_详解(记得收藏)
(下一篇) 16 条 yyds 的代码规范 40 个 SpringBoot 常用注解
全栈程序员站长
2022/09/18
4.5K0
细节、MYSQL_DATE_FORMAT()_函数_详解(记得收藏)
使用moment格式化日期
例如:let startDate = moment(‘2018-09-27’).format(YYYY-MM-DD);
全栈程序员站长
2022/06/30
3.5K0
使用moment格式化日期
gitlab版本升级
day2,从12.10.6升级到12.10.14,然后从12.10.14升级到13.0.14【操作前备份一次】
保持热爱奔赴山海
2022/01/11
2.1K0
gitlab版本升级
数据库中的存储过程、游标、触发器与常用的内置函数
(1)after insert 触发器,在插入数据之后获得@id变量以显示最新的自增长ID
用户10175992
2022/11/21
1.6K0
Java8新特性之日期、时间操作
java.time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类
Remember_Ray
2020/08/03
7K0
MySQL函数及用法示例(收藏大全)
1、字符串函数 ascii(str) 返回字符串str的第一个字符的ascii值(str是空串时返回0) mysql> select ascii('2');   -> 50 mysql> select ascii(2);   -> 50 mysql> select ascii('dete');   -> 100
java思维导图
2018/08/16
8610
centos上使用命令行搭建gitlab
这次我们安装最新的,即:13.4.1这个版本(yum install -y gitlab-ce.x86_64):
超级小可爱
2024/08/07
1990
centos上使用命令行搭建gitlab
C++ Boost库 操作日期与时间
Boost库中默认针对日期与时间的操作库分为,timer,progress_timer,date_time这几类,如下是一些常用的使用方法总结。
王瑞MVP
2022/12/28
1.7K0
R语言 日期、时间和lubridate包
当导入数据时日期值通常以字符串的形式输入到R中,这时需要转化为以数值形式存储的日期变量。用as.Date()把文本转换为Date类型:其语法为as.Date(x,"input_format"),其中x是字符型数据,#input_format则给出了用于读入日期的适当格式
拴小林
2020/11/11
6.2K0
MySQL函数大全及用法示例(三)
dayofweek(date) 返回日期date是星期几(1=星期天,2=星期一,……7=星期六,odbc标准) mysql> select dayofweek('1998-02-03');   -> 3 weekday(date) 返回日期date是星期几(0=星期一,1=星期二,……6= 星期天)。 mysql> select weekday('1997-10-04 22:23:00');   -> 5 mysql> select weekday('1997-11-05');   -> 2 dayofmonth(date) 返回date是一月中的第几日(在1到31范围内) mysql> select dayofmonth('1998-02-03');   -> 3 dayofyear(date) 返回date是一年中的第几日(在1到366范围内) mysql> select dayofyear('1998-02-03');   -> 34 month(date) 返回date中的月份数值 mysql> select month('1998-02-03');   -> 2 dayname(date) 返回date是星期几(按英文名返回) mysql> select dayname("1998-02-05");   -> 'thursday' monthname(date) 返回date是几月(按英文名返回) mysql> select monthname("1998-02-05");   -> 'february' quarter(date) 返回date是一年的第几个季度 mysql> select quarter('98-04-01');   -> 2 week(date,first) 返回date是一年的第几周(first默认值0,first取值1表示周一是 周的开始,0从周日开始) mysql> select week('1998-02-20');   -> 7 mysql> select week('1998-02-20',0);   -> 7 mysql> select week('1998-02-20',1);   -> 8 year(date) 返回date的年份(范围在1000到9999) mysql> select year('98-02-03');   -> 1998 hour(time) 返回time的小时数(范围是0到23) mysql> select hour('10:05:03');   -> 10 minute(time) 返回time的分钟数(范围是0到59) mysql> select minute('98-02-03 10:05:03');   -> 5 second(time) 返回time的秒数(范围是0到59) mysql> select second('10:05:03');   -> 3 period_add(p,n) 增加n个月到时期p并返回(p的格式yymm或yyyymm) mysql> select period_add(9801,2);   -> 199803 period_diff(p1,p2) 返回在时期p1和p2之间月数(p1和p2的格式yymm或yyyymm) mysql> select period_diff(9802,199703);   -> 11 date_add(date,interval expr type) date_sub(date,interval expr type) adddate(date,interval expr type) subdate(date,interval expr type) 对日期时间进行加减法运算 (adddate()和subdate()是date_add()和date_sub()的同义词,也 可以用运算符+和-而不是函数 date是一个datetime或date值,expr对date进行加减法的一个表 达式字符串type指明表达式expr应该如何被解释  [type值 含义 期望的expr格式]:  second 秒 seconds
哲洛不闹
2018/09/14
9400
试用 GitLab 14 以及中国发行版:极狐
时值 GitLab 14 大版本更新,官方对于这个版本给出了非常高的评价,让我非常好奇,所以为了探究新版本到底有哪些变化,我对 GitLab 社区版、极狐版做了试用对比。
soulteary
2021/07/08
1.5K1
试用 GitLab 14 以及中国发行版:极狐
将datetime时间转化成类似于*** 时间前的描述字符串
项目官网地址。关于 react 版本可以看timeago-react,关于Python的版本,可以看 timeago.
用户7293182
2022/01/20
7210
小白博客 MySQL日期时间函数大全
DAYOFWEEK(date) 返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准) mysql> select DAYOFWEEK('1998-02-03'); -> 3 WEEKDAY(date) 返回日期date是星期几(0=星期一,1=星期二,……6= 星期天)。 mysql> select WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> select WEEKDAY('1997-11-05'); -> 2 DAYOFMO
奶糖味的代言
2018/04/11
1.9K0
[Gitlab][docker]自托管代码平台Gitlab | 搭建/使用教程
GIT(必装):Git – Downloading Package (git-scm.com)。装完以后在目标文件夹右键会有Git Bash Here和Git GUI Here两个选项
夜梦星尘
2024/08/20
1.4K0
[Gitlab][docker]自托管代码平台Gitlab | 搭建/使用教程
js中moment方法_jquery 虚拟dom
vue项目中,需要把 moment.js 挂载到全局上(即vue的原型链上),访问时直接使用 this.moment() ;
全栈程序员站长
2022/10/04
7.3K0
js中moment方法_jquery 虚拟dom
推荐阅读
相关推荐
Moment.js常见用法
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验