• C++基础知识


    参考:http://www.bccn.net/article/kfyy/cjj/  C++教程

    variable

    警告 声明而未初始化的变量包含随机值。由于变量所指向的内存还没有初始化,所以不知道该内存地址包含什么值。

    全局变量和用static修饰声明的变量总是初始化为0。而所有其它变量在初始化或赋值之前包含随机值。

    常量

    常量是一种标识符,它的值在运行期间恒定不变。

    C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)

    类中的常量

    const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。

    class A

    {…

    const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员

    int array[SIZE]; // 错误,未知的SIZE

    };

    const数据成员的初始化只能在类构造函数的初始化表中进行,例如

    class A

    {…

    A(int size); // 构造函数

    const int SIZE ;

    };

    A::A(int size) : SIZE(size) // 构造函数的初始化表

    {

    }

    A a(100); // 对象 a 的SIZE值为100

    A b(200); // 对象 b 的SIZE值为200

    怎样才能建立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如

    class A

    {…

    enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量

    int array1[SIZE1];

    int array2[SIZE2];

    };

    枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。

    数据类型

     C++数据类型定义编译器在内存中存放信息的方式。在C++中,必须先声明变量类型再使用变量:int x1 = 1; 这样,编译器就可以进行类型检查,确保程序运行时一切顺利。数据类型使用不当会导致编译错误或警告,以便分析和纠正之后再运行。

    typedef建立别名,使编译器在一个符号与另一符号间划上等号。

    C++基本类型以及表示范围

     

    C++操作符 

    操作符(operator)用于操作数据。

    一元操作符 
    * 间接操作符 int x=*y; 
    & 地址操作符 int* x=&y; 
    ~ 位非 x &=~0x02; 
    ! 逻辑非 if(!valid) {...} 
    ++ 递增操作符 x++(等于x=x+1;) 
    -- 递减操作符 x--; 

    指针数组:int * array[2],元素为指针的数组

    数组指针:int (* array)[100],指向数组类型的指针
    类和结构操作符 
    :: 范围解析 MyClass :: SomeFunction(); 
    -> 间接成员 MyClass-> SomeFunction(); 左边必须为指针
    · 直接成员 MyClass . SomeFunction(); 左边必须是对象或者结构体,一般是类对象

    C++语言提供在一个函数的任意地方声明并使用一个变量的能力。

    “::”是变量域运算符;::temp表示引用全局变量中的temp。

    数组

    任何C++固有数据类型都可以放进数组中。

    C++一个强大的特性是能直接访问内存。由于这个特性,C++无法阻止你写入特定内存地址,即使这个地址是程序不让访问的。下列代码是合法的,但会导致程序或Windows崩溃:int array[5];array[5]=10;这是常见的错误,因为数组是以0为基数的,最大脚标应是4而不是5。如果重载数组末尾,则无法知道哪个内存被改写了,使结果难以预料,甚至会导致程序或Windows崩溃。这类问题很难诊断,因为受影响的内存通常要在很久以后才访问,这时才发生崩溃(让你莫名其中之妙)。所以写入数组时一定要小心。

    数组规则 
    ·数组是以0为基数。数组中的第一个元素为0,第二个元素为1,第三个元素为2,等等。 
    ·数组长度应为编译常量。编译器在编译时必须知道为数组分配多少内存空间。不能用变量指定数组长度。所以下列代码不合法,会导致编译错误: int x = 10;int myArray[x]; // compiler error here· 

    · 大数组从堆叠(heap)而不是堆栈(stack)中分配(详见稍后)。· 从堆叠分配的数组可以用变量指定数组长度。例如:

    int x = 10;int* myArray = new int[x]; // this is OK 

    字符数组/程序结构……略

    C++中的函数

    函数是与主程序分开的码段。这些码段在程序中需要进行特定动作时调用(执行)。参数(parameter)是传递给函数的值,用于改变操作或指示操作程度。

    函数的构成部分使用函数前,要先进行声明。函数声明或原型(prototype)告诉编译器函数所取的参数个数、每个参数的数据类型和函数返回值的数据类型。

    返回类型  函数名  参数表 
    ↓               ↓         ↓ 
    int SomeFunction(int x, int y){ 
    函数体→int z = (x * y); return z;

     ↑

    返回语句 

    变量可以按数值、指针或引用传递给函数

    函数设计(建议)

    1. 函数的功能要单一,不要设计多用途的函数。
    2. 函数体的规模要小,尽量控制在50行代码之内。
    3. 尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。
    4. 不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。
    5. 用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。

    内存分配

    ①内存分配方式

    内存分配方式有三种:

    (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

    (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

    ②常见的内存错误及其对策

    http://www.bccn.net/Article/kfyy/cjj/jc/200512/2634.html

  • 相关阅读:
    android 中webview调用js
    android apk打包之后js调用失效的解决办法
    android软键盘的管理和属性的设置
    android Bitmap(将视图转为bitmap对象)
    android的四种加载模式
    android 从其他app接收分享的内容
    android ADT 设置编辑字体
    android的JNI标准 android的NDK
    iOS开发随笔--iOS捕获异常、常用的异常处理方法
    IOS学习笔记--Objective-C之协议、代码块、分类
  • 原文地址:https://www.cnblogs.com/zhangpeng201211/p/2546739.html
Copyright © 2020-2023  润新知