C++学习笔记——001

  • C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。

 

  • <> 先去系统目录中找头文件,如果没有再到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h 等用这个方法。" " 首先在当前目录下寻找,如果找不到,再到系统目录中寻找。这个用于 include 自定义的头文件,让系统优先使用当前目录中定义的。

 

  • 标准规范中规定 main 函数的返回值为 int,一般约定返回 0 值时代表程序运行无错误,其它值均为错误号,但该约定并非强制。

 

  • 块注释符(/*...*/)是不可以嵌套使用的。

 

  • 在实际项目中,为了防止将“==”误写作“=”,推荐将变量名写在右侧,编译器可以帮助寻找错误。

 

  • 全局变量和和局部变量同名时,可加域名解析在函数中引用到全局变量,不加域名解析则引用局部变量:
#include<iostream>
using namespace std;


int a = 10;


int main()
{
    int a = 20;
    cout << ::a << endl;   // 10
    cout << a << endl;     // 20
    return 0;
}

 

auto x1 = 5, x2 = 5.0, x3='r';  //错误,必须是初始化为同一类型

 

C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别

从作用域看:全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

 

从分配内存空间看:全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。

 

从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

 

宏定义 #define 和常量 const 的区别

类型和安全检查不同:宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,会在编译阶段进行类型检查;

 

编译器处理不同:宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束于编译时期;const常量是一个"运行时"概念,在程序运行使用,类似于一个只读数据;

 

存储方式不同:宏定义是直接替换,不会分配内存,存储于程序的代码段中;const常量需要进行内存分配,存储于程序的数据段中;

 

定义域不同:

void f1 ()
{
    #define N 12
    const int n 12;
}


void f2 ()
{
    cout<<N <<endl; //正确,N已经定义过,不受定义域限制
    cout<<n <<endl; //错误,n定义域只在f1函数中
}

 

定义后能否取消:宏定义可以通过#undef来使之前的宏定义失效;const常量定义后将在定义域内永久有效;

void f1()
{
    #define N 12
    const int n = 12;


    #undef N //取消宏定义后,即使在f1函数中,N也无效了
    #define N 21//取消后可以重新定义
}

 

是否可以做函数参数:宏定义不能作为参数传递给函数;const常量可以在函数的参数列表中出现。

 

register 存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

{
    register int miles;
}

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 'register' 并不意味着变量将被存储在寄存器中,而是有可能存储在寄存器中,这取决于硬件和实现的限制。(计算机做运算时,必须将数据读入寄存器才能运算)

扫码关注公众号,查看更多精彩内容

posted @ 2024-03-16 15:27  不是公子的小白  阅读(26)  评论(0编辑  收藏  举报