C++学习笔记(3)

11.ANSI C++一些不常用的关键字(摘自<<C++语言命令详解(第二版)>>)

       (1)asm(解释汇编代码)

       尽管ANSI规范支持asm关键字来解释汇编代码,但是它的使用是依具体软件而定的.主要的编译器供应商提供他们自己对这个关键字的扩展.汇编代码是一种机器语言而且不容易移植.当使用汇编代码时,应尽可能把它限制在尽可能少的模块中.查看编译器文件以获得更多的信息.

       (2)auto(分配自动变量)

       C++中有一些很恼人的关键字,其中最讨厌的是auto关键字,因为它为没用的目的服务.auto关键字用于局部变量的定义,它指定自动存储类.(这样就指定了函数的每个调用都要建立自己的对变量的拷贝,通常是放在程序的堆栈段.)因为局部变量本身就是存储类,所以auto关键字基本上这些拷贝什么都没有做.

       (3)explicit(禁止自动转换)

       构造函数自动支持类型转换,如定义对象是可以使用myclass ob(expr)myclass = expr,后者就是自动(隐式)的类型转换。而explicit关键字禁止这种自动转换.在使用这个关键字时,应将它放在类定义内构造函数声明的前面.

       (4)mutable(使const类型可改变)

       如果一个对象被声明为const,那么它所有的成员就都是const类型的,它们是不能被改变的.但是有时候你可能要为一个特殊的成员设定一个例外情况.如果把一个成员函数定义为const,则这个函数只能修改类中用mutable修饰的变量,这就是mutable关键字所能做的.

       (5)register(将变量放在CPU的寄存器中)

       register关键字请求将一个变量放置在中央处理器的内部寄存器中.如果在程序中多次使用这个变量,将其放在存储器中能够提高程序的运行速度.

       Register关键字的使用与编译器没有必然联系.它只是寄存器应该如何被分配的一个建议或暗示.为了达到优化目的,现代的编译器倾向于形成自己的关于寄存器分配的看法,这使得这个关键字几乎失去了原来的意义.

       (6)volatile(要求对数据进行刷新)

       volatile关键字暗示某对象是不稳定的.在计算机术语中,一个外部用户可以改变一个可变的对象而不会被警告,这个可变对象可以是操作系统或计算机时钟.每当程序涉及到这个对象时,都需要执行直接内存访问(DMA)操作.编译器不能将这个值放在寄存器中并使它保持当前的状态.

      当将volatile关键字应用于一个声明时,它就会通知编译器这个数据对象是可变的,在每次访问它之前程序必须更新它的值.

       Volatile关键字主要出现在系统程序中.

12.预处理器指令,宏和运算符(摘自<<C++语言命令详解(第二版)>>)

       #define 定义符号或宏

       #elif 在另一条件下编译

       #else 在条件为假的情况下编译

#endif 终止条件块

#error 停止并汇报错误

#if 在条件成立时编译

#ifdef 如果符号被定义则进行编译

#ifndef 在符号末定义的条件下编译

#include 读入头文件

#line 设置行号与源文件

#pragma 设置编译器所指定的特性

#undef 删除符号定义

 

预定义宏:

__cplusplus C++模块下被定义

__DATE__ 当前日期

__FILE__ 当前源文件(包括路径名)

__LINE__ 当前源代码行号

__TIME__ 当前时间

__STDC__ 标准C编译

 

预处理器运算符:

defined(symbol) 如果symbol被定义则返回1,否则返回0

#str 将一字符串str放入被引号括起的字符串

text1##text2 text1text2连接起来

13.有关类里面的属性的初始化的问题

属性的初始化只能在函数里面进行.

例如:

class Person{

private:

char *Name;

public: 

    Person(){Name=new char[50];}//在构造函数里面为指针Name置首地址

    ~Person(){}

};

14.有关指针初始化的问题

不能直接用p=NULL来给指针初始化,要先给p分配空间后才能给p赋值

15.再看一个指针与数组的例子

#include<iostream.h>

void main()

{

       char ch[]="fowenler";

       cout<<"input 1:"<<endl;

       cout<<ch<<endl;//fowenler

       cout<<&ch<<endl;//0x0012FF74

       cout<<&ch+1<<endl;//0x0012FF7D

       cout<<&ch+2<<endl;//0x0012FF86

       cout<<&ch+3<<endl;//0x0012FF8F

       cout<<&ch+4<<endl;//0x0012FF98

       cout<<ch+3<<endl;//enler

}

由上面可以知道coutostream类的一个实例,<<是被重载了的,它所需要的参数是地址值,cout<<ch是输出以ch为首地址的字符数组内容,cout<<&ch就是输出首地址的值,cout<<&ch+1是输出数组中第二个元素的地址值,因为这个数组是char型的,它占8,所以&ch+1的值比&ch的值大8(FD-74=9,刚好两者之间差8).cout<<ch+3就是指从数组的第三个元素后开始输出字符.

16.关键字static的特性及其好处:

       如果对象中的某一属性或成员函数与特定对象无关时,可以在类中将此属性或成员函数定义为static。这样可以使多个实例共用一个内存块,因此使用static声明函数和变量可以节省内存空间。

       static声明一个变量或一个函数后,变量和函数所驻留的内存地址是不变的。即变量名和函数名在映射内存地址的时候是固定的。

       使用static声明类的一个成员函数后,可以不产生实例就能调用该函数,但static成员函数里面所使用的变量也应该是static的。Static成员函数没有this指针。

       要使用类中的static属性和方法可以直接用类名来访问。如Afun()A是类名。 

       在一个项目中的多个文件中如果有多个函数使用同一个函数名字,就可能会产生冲突。如果用了static定义它们,他们就会相安无事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值