QT_C++

QT_C++


C 与 C++  区别:  面向过程:吃(狗,屎)

            面向对象:狗. 吃(屎)

                   ^ . ^

                

博客:https://www.runoob.com/cplusplus/cpp-tutorial.html

 

插入符:<<

控制符:endl  

换行符:\n

cout:打印屏幕输出(  cout.put   )

cin  :读取键盘输入(cin>>    cin.get()  )

 

数据类型:  类

  类:  描述一种数据类型全部属性

  对象: 根据描述创建的实体

  类库

 

  英雄 雷锋  (类   对象)

    iostream   cout (cout 是 iostream 的类对象)

 

数据:   常量  变量

类型: 基本类型: 整型(无符号和有符号 *  char,  short,  int,  long,  long long  =  10 种) 

            short 至少16位

            int 至少与short一样长  (自然长度,计算机处理效率最高)

            long至少32位,至少与int一样长 (大于16位使用)

            long  long  64位 

 

 

          实型(float, double, long double)

            float  至少32位(32位)

            double  至少48位,不少于float(64位)

               long double 至少和double一样多

 

            表示方法:小数 指数(E法:E+n小数点右移n位;E-n小数点左移n位)

 

 

 

           字符(char)''

            #include<climits>

                  

                这些其实就是宏 !

 

                

            字符串:"  "

 

          bool:  true 1  false 0

          const  限定符

 

 

类型转换:

  表达式转换:整型提升(bool, char, unsigned char, short 提升为 int )int 为计算机的自然类型

        运算涉及两种类型,小类型转换为大类型  

  传参的转换:整型提升  float 提升为 double

  强制的转换: (int)val  C   int(val)  c++       很危险     

         static_cast<long><val> 将一种类型转换为另一种类型;

 

 

 

 

 

 

 

 

 


 

 

 

整型常量:十进制  八进制  十六进制

            

 

 

 

            浮点 

             使用变量

      复合类型:

 

 变量名:两个下划线或下划线和大写字母开头的名称被保留给实现使用,以一个下划线开头的名称被保留给实现,用作全局标识符。

 

 

 

 运算符


 

+  -  *   /    %

 

 

复合类型(构造类型)

 

数组


 数组的  

动态联编:int arr [5] ;

静态联编:int * arr = new int [10];

 

数组表示法;arr [1];

指针表示法:*(arr + 1);

 

 

 

 

 

字符串


 字符数组  指针(常用)  string类库

 

字符数组

  char arr[5] = {'a', 'b', 'c', '\0' };

  char arr[ ]  = {"abc"};

 

 字符串的比较:strncmp

 

 

拼接字符串常量:

 将两个引号中的字符串合并为一个

面向行输入:

 cin.getline: cin.getline(arr, 20);

    cin.get:   cin.get(arr,20)  /  cin.get()

    cin.get.get cingetline.getline (拼接)

   get() 读取空行后将设置失效位,可以通过cin.clear() 恢复;

 

字符数字混合:  

   

string 类: 提供了字符串作为数据类型的表示方法

  string str ; str 创建一个长度为0的string对象,并自动调整str的长度(所以更加方便!)

  char 数组用于存储一个字符串的char存储单元;string类表示字符串的实体;

   特点: 1. 可以像整型一样,直接赋值;(字符数组不行)

     2. 字符合并相加,arr1 += arr2  (arr2插入arr1尾部)

    字符数组:strncpy(string1, string2,n);string类的字符串拷贝:直接赋值

    字符数组:strncat (string1,string2,n) ;string类的字符串尾插:直接 +=

    字符数组存在溢出危险,string类不担心

   所以字符串处理:string类比字符数组更加简单;

 

   string类的IO:

 

 

 

 

 

 

结构体


struct

C++结构体定义可以省略struct 

由于C++使用string类作为字符串的数据类型,则可以添加到结构体中;

结构体可以作为函数参数和返回值,同类型结构体变量可以相互赋值(即使是数组);

C++结构体除了成员变量,还可以有成员函数;

 

结构体数组:

  struct arr [5]    arr 为数组,并非结构体; arr[0] 为结构体;

  初始化:struct arr[5] = {

        {  },  

        {  },

        {  },

      };

 

结构体位字段:指定占用特定位数的结构体成员

  struct  info {

    u8 :  4;

    boo: 1 ;

  } 

 

 

联合体


union

可以存储不同数据类型,只能同时存储其中一种类型

由于共用体每次只能存储一个值,则它必须有足够的空间来存储最大的值,所以共用体长度为最大成员的长度;

匿名联合体:没有名称,成员位于相同地址处的变量

用途:数据使用多种格式,可节省空间;

 

 

枚举


 enum

enum  tem (a,b,c,d);

abcd 符号常量,代表0~3;常量叫做枚举量

tem  只能被abcd赋值;枚举变量只能被枚举量赋值

枚举量是整型,可被提升为int,但int不能自动转换为枚举类型

枚举量之间不能运算符,要不然为int型;

用处:常用来定义相关的符号常量,如switch语句中使用的符号常量

枚举量赋值:enum tem (a=2,b,c=3,d) 没有赋值的值默认比前一个大1,b=c=3

枚举的范围:

 

 

指针


(地址 + 步长) 

c  int *point  c++ int* point

计算器分配存储地址的内存,不会分配存储指针指向数据的内存;

int *p;  p=(int *)0x00000001;

 

指针:运行阶段分配没命名的内存以存储值;

malloc 分配内存

new  操作符(运行阶段为int分配未命名内存) 堆空间

 new特点:运行时创建,优于编译时创建!

 new创建动态指针

  设置数据类型,new找到正确的内存块,返回内存块的地址;

  typename  point  =  new  typename ;

   int *p = new int ;

  内存被耗尽,new返回0! 

    内存的释放:delete操作符,将内存归还内存池;

   int *p = new int ;  delete p ;

   一定成对使用,否则发生内存泄漏!(被分配的内存再无法使用,如泄漏严重程序由于不断寻找更多内存而终止)

   (不能释放两次,结果不确定,delete不能释放声明过的内存!)

  new创建动态数组

   int *p = new int [10] ;(返回第一个元素的地址)

   delete [ ] p ; (new带[],delete带[],new不带[],delete不带[])

   new和delete:delete只释放new分配的内存;

           delete不能对同一内存释放两次;

           new[]为数组分配内存,用delete[]释放;

           new[]为实体分配内存,用delete释放;

           空值指针,delete是安全的

    不能用sizeof来确定动态分配数组的字节数!

    动态数组成员使用:

    int *p = new int [3];

      p[0] = 1;

      p[1] = 2;

 

 指针 + 1 = 指针 + 步长

   

  new创建动态结构

  创建动态结构:

  struct  info {

    char * name ;

    int age ;

  }

  info* tony = new info; 

  tony->name;

  *(tony).age;

 

 

数据管理内存方式:

  自动存储:

    函数内部定义的常规变量(函数调用自动产生,函数结束自动消失)

    局部变量

 

  静态存储:

    整个程序执行期间一直存在

    方式:函数外定义;关键词static修饰

 

  动态存储:

    new / delete 管理一个内存池,允许一个函数分配另一个函数释放;数据生命周期不受程序或函数的生存时间控制

 

  

 

  

 指针是被设计用来存储地址的变量

 

 

 

控制流


 顺序  选择(if;if...else...;if..else if...else...; switch)  循环(for; while; do...while)

 

C++:for允许for(int i=0;i<num;i++) 程序离开循环,变量消失

i++:当前值计算表达式,然后值加1

++i:当前值加1,然后计算表达式

*++p 指针加1再取值  ++*p 指针取值再加1

*p++   ++优于*

组合赋值操作符:+= -= *= /= %=

逗号表达式的值为第二个值;优先级最低

关系表达式:>, <,  = =,  >=,  <=, != 六种  优先级比算数表达式低

 

for  for  与二维数组

 

  

if:

 

 

逻辑表达式

逻辑操作符 ,用于表达式:&& || !三种  

 && 与 关系操作符,构成取值范围

 

   

 字符函数库 cctype:

  isspace 检测字符是否为空白 isalpha()检测字符是否为字母

  ispunct  检测字符是否为标点 isdigits()检测字符是否为数字

 

 三目运算符:?:  int c = a>b ? a:b  常用来替代if...else 语句

 

 枚举做标签与switch结合

 switch与if..else..区别:

  switch不能处理小数与取值范围

  对于整数,switch比if...else...效率更高

  项数不小于三项用switch

 

break  : 跳出循环(结束循环)只在循环中使用

continue   :跳回循环 (重新循环)

 

文件IO

 

 

 

C++编程模块


 

 函数不能返回数组,可以将数组作为结构或者对象组成部分来返回

可以返回,整型 实型 结构 对象

函数原型自动将被传递的参数强转为期待的类型

 

数组作为函数的形参:void fun(int arr[], int n) ==  void fun(int *arr, int n)   // arr为数组名,n为size

void fun(const int arr[], int n)  不能修改实参数组的数据

1.传统第一个参数提供数组的起始位置,第二个参数提供数组的长度

2.数组区间函数,通过两个指针,第一个参数为数组起始位置,第二个参数为数组的终点位置

 void fun(const int *arr, const int *end);

数组作为函参意义:

 

const 变量的地址可以赋给const指针,但const变量地址不能赋给常规指针

 

函数与二维数组:

  int fun( int(*arr)[ 4 ],  int size) == int fun( int arr[ ][ 4 ], int size)

    arr 为数组指针

 

函数与字符串:

   int fun(const char* arr, char ch)

   返回字符串:

 

 

函数与结构体:

   结构体作为函参:

   结构体作为返值:

    struct info{

      char name[20];

      int name ;

    }

    info fun( info t1, info t2 );

      info fun(info* t1, info* t2);

  

 

函数与string对象:

     string arr [size];  数组的每个元素都为string对象

 

函数与递归:

    自己调自己,容易出现死循环;

 

函数与指针:

   函数指针:void  (*fun)(void)

   指针函数:void *fun(void)

 

 

 函数探幽


 

 

 

 

内联函数

——————————————————————————————————————————————

《inline 内敛函数》

函数:不断的压栈出栈,再压栈出栈,开销比较大。

宏:预处理阶段展开;不需要压栈出栈,弊端数据不处理。

内联函数:编译器阶段展开;不需要压栈出栈,
  本质:牺牲代码段空间为代价,提高运行的时间效率;
  特点:定义声明加inline
     c++编译器将函数体直接插入到被调用的地方;
     没有普通函数调用时的开销(压栈,跳转,返回)
  弊端:函数不能庞大,循环,判断,取址


计算机速度:cpu(寄存器)>缓存>内存>硬盘>网线

 

 

  运行速度比常规函数快,但占用更多的内存;

 

内联函数不能递归;

—————————————————————————————————————————————— 

 

 

 

 

引用变量

——————————————————————————————————————————————

   是一种复合类型;

   主要用于函数的形参:函数将使用原始数据,而不是拷贝;

   1. 声明时必须初始化;

   2. &前有数据类型为引用,其他皆为取址

   3. 可对引用再次引用,多次引用只是取别名

   4. 引用与变量地址相同

  int a ;  

  int & b = a;

 

引用作函参:

  值传递导致函数调用使用拷贝;

  引用允许被调函数访问调用函数的变量;

 

引用与结构:

   struct info{

     char name[10];

     int name ;

  };

  const info & fun(info & a);

    const返回引用最佳:意味着不能使用返回的引用直接修改他指向的结构!

    返回引用不能使用临时值,要不然不存在!!

    

 

   遇到一个strcpy的C++问题:

   

   将strcpy_s代替strcpy插入include<cstring>,可以编过

 

 

 

引用与类对象:

   类对象作为函参,常使用引用 !(如string)

  

对象继承与引用:

  

 

 

 

 

 

 

 

默认占位参数

——————————————————————————————————————————————

《函数的默认参数与占位参数》

默认参数:定义函数参数直接赋值,默认起始从右至左 !

占位参数:没什么意义!

——————————————————————————————————————————————

 

 

 

 

 

函数重载: 

——————————————————————————————————————————————
《函数重载》

函数重载:函名相同,函参不同,缺一不可!
注意:函数重载,不要写默认参数,避免函数冲突!
类型严格匹配,不匹配隐式转换,字符串不行!

编译器:void fun(char a,int b) --> fun_ci
——————————————————————————————————————————————

 

 

 

 

函数模板

——————————————————————————————————————————————

template<class any>    (typename any)

void fun(any &a,  any& b){

  any temp ;

  temp = a;

  a = b ;

}

 

 

函数重载模板

——————————————————————————————————————————————

template<class any>    (typename any)

void fun(any &a,  any& b);

void fun(any &a,  any& b, int  c)

 

 

 

 内存模型与名称空间


数据存储:自动:  (局部)

 

 

 

     静态:static  (定义的位置至结束)

        外部,内部,无链接性 

 

 

     动态:new / delete  ()

 

 

 

作用域: 局部变量:局部函数

     全局变量:定义位置至结束;

     

 

 
 
 说明限定符:
  auto:声明自动变量
  register:声明寄存器存储类型
  static:
  extern
  mutable
  const:初始化后,不能进行修改
  volatile:
 
 
 
布局new操作符:
  
 
 
命名空间:
 
 
 
 对象与类
面向过程:
面向对象:
 
 
定义类:
class info {
private:
  
 
public:
 
 
};
 
 
类与结构:
  类与结构唯一区别:结构默认public   类默认:private
 
 
类中有方法,类创建对象;
 
同一个类的所有对象,共享同一组类方法;
 
 
 
使用类:
 
 
 
类的 构造函数和析构函数
 
构造函数:没有类型,返回值
  定义:info(int a, char b);
  使用:两种  info a = info (1,2,3);
         info a = info (1,2,3);
 
    info a = new info(1,2,3)
 
  默认构造函数:
  特殊的类成员函数,在创建类对象是被调用,函数名和类名相同,可以函数重载,
  
 
析构函数:没有类型,参数,返回值
     对构造函数进行清理工作;
     每个类只能有一个析构函数;
     构造函数使用new,必须使用delete的析构函数;
 
 
 
this指针:
 
  
 
 
对象数组:
 
 
 
 
类作用域:
  类中变量作用域整个类;
 
 
抽象数据类型:
  
 
 
使用类

操作符重载:
  operator op(argument - list)
   operator+(); 重载+操作符
  
 
 
 
友元三友:
  友元函数
  友元类
  友元成员函数
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
类的动态内存分配

 动态内存和类:
  new:程序在运行时决定分配内存,而不是在编译时决定;
  静态类成员,无论创建多少对象,程序都只创建一个静态类变量副本;
  
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
类的继承

基类派生类:一个类派生另一个类,原始为基类,继承为派生类;
    派生类对象可以使用基类的方法(方法不是私有);
    派生类不能直接访问基类的私有数据,通过基类公有方法访问。
 
 
三种继承:
  公有继承:建立 is-a 关系
  保护继承:
  私有继承:
    
 
 多态公有继承:
  
 
 访问控制:protected
  private与protected区别:只有在派生类才表现,派生类成员可以直接访问基类的保护成员,不能访问私有成员!
   
 
抽象基类:
 
 
继承和动态分配内存:
   
 
 
元友  异常

元友:
  • 友元函数
  • 友元类
  • 友元成员函数
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 c++primer ——>310
 
 
 
笔记

main 返回值并不是返回给程序,而是返回给操作系统,0代表成功,非0为异常;
c++ 一般存为int型,除非特殊设置或数据过大!
char 字符和小整数
cout.put() 显示一个字符(句点表示成员操作符)
char 作数值类型,可能是有符号,也可能是无符号;作字符类型,有无符号都没关系
const 与  #define 区别:1.const可以明确的指定类型,2.定义域可以限制在函数中,3.用于更复杂的类型
浮点型优缺点:1.可以表示整数之间的值  2.表示的范围很大    —  1.运算速度比整型慢  2. 精度低 
float C++ 只保证6位有效位
/ 两个都为整数,结果为整数;有一个为小数,结果为小数
常量是没有地址的,如果要取地址,编译器会临时开辟一段空间,让指针只向
C++中,class与struct功能一样,区别在于class默认权限是private,struct默认权限是public !!
C++中,操作符就是运算符 
cout 不能输出 string ? 添加#include<string>
 
 
 
 
 
posted @ 2019-08-09 16:42  panda_w  阅读(1222)  评论(0编辑  收藏  举报