一些不太常用C++语法

慢慢更新:
1. placement new 方法
如:pi = new (ptr) int; //placement new
    括号里的参数是一个指针,它指向一个内存缓冲器,new操作将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定的;
    STL 标准库中 allocator 空间分配器, 就使用了这个语法。
先使用 malloc 分配内存p. 然后 在该内存内构造自己的类对象   new(p) T1(value) ; T1 是构造的类型,value 是类型的值

2. naked function
当你的函数内部较简单,用不到太多寄存器。或者需要根据上下文决定一些寄存器变量的时候。可以用naked 函数。对于一般的函数,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。使用naked函数,我们可以自己编写干干净净的函数,特别是当你代码没有使用这些寄存器的时候。可以像内联函数一样,省略一些操作。              
       void __declspec(naked) MyNakedFunction()
        {
            // Naked functions must provide their own prolog.
            __asm
            {
                PUSH EBP
                MOV ESP, EBP
                SUB ESP, __LOCAL_SIZE
            }

            // And we must provide epilog.
            __asm
            {
                POP EBP
                RET
            }
        }

3. 指向类成员函数的指针
在MFC库中很多窗口基类中调用派生类的消息处理函数。因为windows消息众多,如果为每个消息都设立虚函数,而每个虚函数都占用4 bytes,那样很多类体积将非常庞大。而且有些地方基类设计时考虑到派生类在此可能要作些处理,又不想使用虚函数的话也可以使用指向成员函数的指针。如下面的类。如果派生类没有修改pf成员,在release中  (this->*pf)() 将被优化掉。而且使用指向成员函数的指针也不用定死函数名字.
class animate
{
typedef void (animate::*pfun)();
public:
    animate() {pf=static_cast<pfun>(donothing);}
    void sleep()
    {   
        cout<<"animate sleep"<<endl;
        (this->*pf)();       
    }
    void donothing(){}
pfun pf;
};


class fish:public animate
{
public:
    fish() {pf = static_cast<pfun> (test);}
    void test()
    {
        cout<<"使用基类指针调用派生类非虚函数"<<endl;
    }
};



int _tmain(int argc, _TCHAR* argv[])
{

    animate* fs = new fish;   
    fs->sleep();   
    delete fs;
    return 0;
}

4 __declspec(novtable) 

    C++中没有提供类似interface这样的关键字来定义接口,但是Mircrosoft c++中提供了__declspec(novtable)来修饰一个类,来表示该类没有虚函数表,也就是虚函数都(应该)是纯虚的
       声明的基类没有 vtable(虚拟函数表), 但还是有vptr指针(指向虚拟函数表)的。所以a1* a= new a1; a->hello()执行将会出错 。 而从a1派生的b1是有vtable的。所以 a1* a = new b1; a->hello() 将调用 b1 的hello函数。如果b1未定义hello函数,那么将调用 a1 函数。其实还是从b1对象的vptr指向的vtable中索引的函数地址。编译时由于b1中没有定义hello虚函数.   vtable 中虚函数hello指向的是a1类hello函数地址。良好的面向对象设计应该由派生类完成实现。面向对象规则第一条就是基于接口编程。所以将a1 函数均定义为纯虚函数,a1相当于接口,由派生类b1来实现,这样将抽象与实现之间解耦合,更符合面向对象规范。
       这样定义的类a1不能调用虚函数。所以a1 类应看成接口。不应生成 a1 类对象。同样程序生成时将节省a1 类 vtable 的空间。如果有大量虚函数,节省空间还是可观的 函数个数*4. 
     次关键字为vc 所有,其他c++编译器并不支持
                                                                                                        
class __declspec(novtable) a1
{
public:
    a1() {}
    virtual void hello()
    {
        cout<<"a hello"<<endl;
    }
};

class b1:public a1
{
public :
    b1() {}
    void hello()
    {
        cout<<"b hello"<<endl;
    }
};

### C++ 常用语法规则及示例 #### 程序结构概述 C++程序结构涉及多个层面,包括但限于程序流程控制、文件组织形式、编译预处理指令的应用、命名空间管理以及标准库的运用[^1]。 #### 变量声明与数据类型 变量声明是编程中的基础操作之一,在C++中可以通过如下方式定义同类型的变量: ```cpp int age = 20; double salary = 3500.75; char grade = 'A'; bool isPassed = true; ``` #### 控制流语句 条件判断和循环机制对于实现逻辑分支至关重要。下面展示了if-else语句和for循环的例子: ```cpp // If Else Statement Example if (age >= 18) { std::cout << "Adult"; } else { std::cout << "Minor"; } // For Loop Example for(int i=0;i<5;++i){ std::cout<<i<<"\n"; } ``` #### 函数定义 函数用于封装可重复使用的代码片段,提高代码模块化程度。这里给出一个简单的加法器函数实例: ```cpp #include<iostream> using namespace std; int addNumbers(int a, int b){ return a+b; } int main(){ cout<<"Sum of two numbers:"<<addNumbers(5,6); return 0; } ``` #### 枚举类型 枚举允许创建一组具名整型常量集合,简化特定场景下的编码工作。例如交通信号灯颜色可以用枚举来表示: ```cpp enum TrafficLight { Red, Yellow, Green }; TrafficLight currentColor = Red; std::cout << static_cast<int>(currentColor); // 输出当前颜色对应的数值 ``` 上述例子说明了如何通过`static_cast`将枚举成员转换成其底层整数类型以便于输出显示[^3]。 #### 类与对象 面向对象特性使得C++成为强大的开发工具。类作为自定义数据类型的模板,支持属性和方法的组合;而对象则是基于此类的具体实体。考虑一个人物角色的设计模式: ```cpp class Character{ private: string name; public: void setName(string n){name=n;} string getName(){return name;} }; Character hero; hero.setName("Hero"); cout<<hero.getName(); ``` 以上内容覆盖了一些常见的C++语法要点并提供了相应的实践案例供学习者参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值