zoukankan      html  css  js  c++  java
  • C++知识梳理

    概述

    C++语言是一种面向对象与面向过程混合式语言(混合型OO语言)。是C的超集。代码效率较java、python等要高。  

        支持 头文件程序结构、名字空间、异常处理、运算符重载、函数模板和类模板、多继承、指针。

     备注:关于C++向C的兼容可以从程序结构和头文件等方面进行理解。C++允许在类体外定义变量和函数;C++头文件分为3种:.h旧式头文件都来源于C

    1.关于左值和右值

    左值表达式:可以在等号左边出现的值表达式
    – 非const类型的变量、:int x; x=2; 
    – 引用非const类型的变量:int &y=x; y=3; 
    – 非const指针和非const内容:char*p=&z; p="ab";
    – 返回引用非const类型的函数:int &f ( ) { }; f ( )=3
    – 前置++和--运算:int C=1; (++C) =5; //C++=5?
    – 赋值运算: (C=2)=3; (C+=2)=3;  在C++里赋值表达式为左值,返回对象的引用
    右值表达式:只能出现在等号右边的值表达式
    – 字面常量
    – 后置++,--
    – const类型的变量或引用
    – C++返回左值的函数调用可以出现在等号左边
    – 左值表达式是右值表达式,反之则不一定成立

    2.关于const

    -定义const变量必须同时初始化(唯一的一次赋值机会)const是说明存储方式而不是数据类型

      特例:int  *const elems;   *const_cast<int**>(&elems) = new int[m]; //必须提升一级指针做去const操作

        //const_cast<int*>(elems) = new int[m];     //这样不行.

    -const 修饰方式    

      指针本身是常量不可变   const char* pContent; 

      指针所指向的内容是常量不可变     char* const pContent; 

      都不可变   const char* const pContent; 

      备注 : 在结合性不明情况下,要有加括号的习惯。比如 *p[]和(*p)[] 逻辑意义不同;比如宏定义 宏参和宏体都须加括号 

    -const 实际作用

      1.修饰形参引用

        “值传递”比“引用传递”多一个内存拷贝,为提高性能但又不希望函数改变形参对象,可以考虑将形参做成const型引用。(基本类型不存在构造析构,无此必要)

        eg.void func(A & Dst , const A& Source);

       2.修饰函数体

         void f(int i) const {} 将会构成void f(int i)  {} 的重载

        前者的目的是从编译器层面拦截修改数据成员的行为。(成员函数的后面加上了const,就表示这个成员函数不能对数据成员进行任何的修改动作)

    3.关于static

    -面向过程的static(指在类体外定义static的变量或函数)

      目的:使得该变量和函数只在本文件(以.c或.cpp结尾的文件)生效(可以避免多文件编译时命名冲突问题)。

      因为当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性(这一点可以从汇编层面可运行程序的数据段去理解,目前我理解的数据段分为三种全局、static、const数据段,不知道是否正确,《深入理解计算机系统》书中好像有讲,不大记得,若有人知道,望告知~)。

    -

    -

      备注:关于变量存储位置

        1.static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放。

        2.const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。

          const局部变量存储在栈中,代码块结束时释放。

        3.局部变量存储在栈中,代码块结束时释放。

          malloc 或 new 的变量存储在堆中,由free、delete或关门函数(程序结束时调用,相似地,开工函数用于创建main进程)释放。

        注:当全局变量和静态局部变量未赋初值时,系统自动置为0。


        

     

  • 相关阅读:
    Jmeter +Maven+jenkins+eclipse 接口自动化测试
    感知机
    第1章 统计学习方法概论
    java jdk安装 以及myeclipse安装
    邻接表
    c语言 文件写入和读取
    c++ string
    线程-run和start
    Transfer learning across two sentiment classes using deep learning
    层次遍历
  • 原文地址:https://www.cnblogs.com/mangoczp/p/9529223.html
Copyright © 2011-2022 走看看