zoukankan      html  css  js  c++  java
  • C++进阶4.C++知识整理

    C++知识整理(多益笔试) 20131012

    前言:

             还是关于笔试知识的整理,主要是面向对象的知识还有一些常见的语法知识。

    1.还是C++内存管理的知识

             C++中程序的内存分布如下:

             栈:向下增长,可读可写可执行;

             堆:向上增长,可读可写可执行;

             BSS数据段(就是存放未初始化的数据段):向上增长,可读可写不可以执行;如果程序员没有初始化,但是在这一个数据段中的数据会将内存清0,默认初始化是0.

             .data数据段:向上增长,可读可写不可以执行,就是存放的全局变量、静态变量的(已经初始化);

             .text 代码段:向上增长,可读可写不可以执行。

             分析一下程序中变量:

             局部变量、函数参数存放在栈中;静态局部变量,并不是在调用函数的时候分配,在函数返回的时候释放,而是像全局变量一样,静态的分配在数据段,作用只能在函数内部使用。

             堆,是动态费分配内存的空间;new malloc

             全局变量、静态变量位于数据段,未初始化的全局变量静态变量则是位于bss数据段。程序运行开始的时候,初始化为0,放在data段后面合称为数据区。但是不占用exe执行文件的大小。

             const修饰的全局变量在rodata只读数据段,const修饰的变量必须初始化,如果未初始化,将会被设置成为0,只读数据段和代码段在同一个段中。

             代码段:存储程序文本,指令指针就是在这里获取,一个段是可以被共享的。

    2. 一个陷阱

    int  a=5,b=6,c=7,d=8,m = 2,n = 2;

    (m=a>b)&& (n=c>d);

     首先是运算符的优先级 > 的优先级是比 = 大的。然后就是问题出现的地方了:

    (m= a>b) &&(n= c>d); 首先a>b 是错的,则m= 0,之后的表达式是不会被执行的,所以n依旧是2;

    3.C++中只用普通的成员函数,析构函数可以使用虚函数,其他的构造函数、静态函数是不可以声明为virtual函数的。同时在析构函数中,声明析构函数式virtual类型,用于继承,当使用父类的指针指向子类的对象的时候,删除指针的时候,只会自动调用父类的析构函数,而不会调用子类的析构函数,这样会造成内存的泄露。所以子类的析构函数也需要使用virtual声明为析构函数,当delete指针的时候,也会自动调用子类中的析构函数。

             同时指针是不可以随便delete的,只有对于在堆中的对象的指针,才是可以删除的,否则运行的时候内存报错.

             Devried d;

        Base *pBase = &d;

        delete pBase;

    虚析构函数

    class Base{

    public:

        Base(){

            cout << "Base:Base()" << endl;

        }

        virtual ~Base(){

            cout << "Base::~Base()" << endl;

        }

    };

    class Devried : public Base{

    public:

        Devried(){

            cout << "Devried::Devried()" << endl;

        }

        ~Devried(){

            cout << "Devried::~Devried()" << endl;

        }

    };

    Base *pBase = new Devried();

    delete pBase;

    Base:Base()

    Devried::Devried()

    Devried::~Devried()

    Base::~Base()

    请按任意键继续. . .

    4.C++不是一中类型安全性的编程语言,因为不同类型的指针可以互相转换,而C#是类型安全恶编程语言.

    5.函数返回值是数组类型的时候,只是返回的数组的地址,而不是数组,所以这个数组在函数中必须是通过动态分配内存实现的,否则函数结束之后,会自动释放掉数组的栈空间。

    6. 命令行参数

    main.exe adv edf //argc = 3, 分别是 三个字符串,其中argv是指向字符指针的指针。

    int main(int argc, char **argv)

    {

             char *str,cx;

             cout << *argv << endl;

             cout << *++argv << endl;

             cout << (char) *((*argv)+1) << endl;

             int cn = 0;

             if(argc < 2){

                       return 0;

             }

    }

    7.对于unsigned int + int 值,都转成unsigned int 的类型。

    但是返回结果赋值给其他的变量的时候,有会转为相应的类型

        int a = 14;

        unsigned int b = -20;

        cout << a+b << endl; // 很大的一个正数

        int c = a+b;  // -6

        cout << c << endl;

    8.do{ } while(false);只会执行一次、

        int i = 0;

        do{

            i++;

            if(i < 16){

                printf("123");

            }

        }while(false);

    9.printf("123"+"123");编译出错。

  • 相关阅读:
    阿里云安装Kafka并配置外网访问
    Golang之select中time.After()为什么不生效
    macOS配置GitHub和GitLab共存
    Golang获取HTTP请求IP
    macOS下安装Python3.8并设置为默认版本
    mysql之力扣数据库题目620有趣的电影优化记录
    Pgsql之查询一个月份的天数
    Pgsql之查询一段时间内的所有年月yyyy-mm
    Pgsql之查询一段时间内的所有日期
    swiper下echarts点击事件失效
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3409501.html
Copyright © 2011-2022 走看看