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

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

day1


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


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


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


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


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



C++开发平台


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


C++基于c的扩展


第一个c++程序


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


#include <iostream>
int main(int argc, char **argv)
{
  std::cout<<"第一个c++程序"<<std::endl;
  return 0;
}


编译:


g++ -o main 1-第一个c++程序.cpp 


运行:


gec:$./main
第一个c++程序


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


1.后缀


.h,  .cpp,  .cc,  .hpp,  .cxx


2.头文件


#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::


比如:输入


int a=0; double b;  char c[8];
std::cin >> a;  
std::cin >> a >> b >> c;


比如:输出


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++的输入输出实现学生数据初始化和显示学生信息


#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;
}


运行效果


gec:$./main 
请输入学生信息(name age number):jack 19 1001
name:jack
age:19
number:1001


在c++中使用c库函数



  1. 标准c库函数


直接可以用c++里面自带的头文件比如, cstdio, cstdlib, cstdbool


  1. 非标准c库函数


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


calc.h


#ifndef _CALC_H
#define _CALC_H
int add(int a, int b);
int sub(int a, int b);
#endif


calc.c


#include "calc.h"
int add(int a, int b)
{
  return a+b;
}
int sub(int a, int b)
{
  return a-b;
}


main.cpp


#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语言源代码可以直接编译


g++ main.cpp calc.c  -o main   #有c源代码的时候添加头文件不能用extern "C"{#include"calc.h"}


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


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


gcc -o libcalc.so -shared -fPIC calc.c


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


要修改main.cpp


#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


g++ -o main main.cpp  -L./  -lcalc  
#-L后是库所在的路径, -l后面接库名  ,比如libcalc.so库名就是calc


指针堆内存


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


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


指针变量定义:


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


int *ptr = 0x12345678; //错误


3-c++指针.cpp:6:13: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
  int *ptr = 0x12345678;
             ^


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


如果实现上面ptr赋值


int  *ptr =  (int *)0x12345678;


堆内存分配


C语言中


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


char  *str  = (char*)malloc(100);
free(str);


C++语言中


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


申请堆空间格式:


数据类型   *变量名称   =   new   数据类型;  //申请一个对象
数据类型   *变量名称   =   new   数据类型[n]; //申请n个对象


释放对空格式:


delete  变量名称;
delete  []变量名称;


例子


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 指向堆空间, 并且把空间中的每一个字节数据输出(整型数)


#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)]


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


定义:


namepace  名称{
  变量, 函数, 类
};


例子:


namespace  A
{
  int data;
  void  showA()
  {
    cout<<data<<endl;
  }
}
namespace  B
{
  int data;
  void  showA()
  {
    cout<<data<<endl;
  }
}


使用命名空间


第一种方法


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


int main(void)
{
  std::cin>>B::data>>A::data;
  A::show();
  B::show();
}


第二种方法


using指引


using namespace  B;  //using指引
using namespace  std;
int main(void)
{
  cin>>data>>A::data;
  A::show();
  show();
}


第三种用法


using 声明


using namespace  std;
using B::data;  //using声明
int main(void)
{
  cin>>data>>A::data;
  A::show();
  B::show();
}


空间嵌套


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文件


namespace AAA{
  int dataA;
}


file2.h文件


 namespace AAA{    
     int dataB;
 }


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


匿名空间


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


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、读下面程序是否有问题如果有指出改正,并且输出结果是什么?


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;
} 


相关文章
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
191 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
86 0
WK
|
29天前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
62 5
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
24 1
|
3月前
|
定位技术 Go 开发工具
dynamic-situational-awareness-qt学习记录
本文是作者yantuguiguziPGJ关于dynamic-situational-awareness-qt学习记录的分享,介绍了在Qt学习过程中发现的qml资源丰富的代码仓库,并提供了资源路径和相关的安装、配置步骤,涉及的内容有数字地球、GIS纹理等,同时提供了相关链接和git命令来克隆代码仓库和ArcGIS Runtime SDK for Qt的安装说明。
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
191 2
|
4月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
103 4
|
4月前
|
安全 C++
C++ QT 单例模式
C++ QT 单例模式
72 0