C++(day2)

  (1)域运算符

(2)new、delete运算符

(3)重载

(4)name managling与extern "C"

  (5)带默认参数的函数

1、C++中增加的作用域标识符::

  ¥用于对与局部变量同名的全局变量进行访问。

  ¥用于表示类的成员,这将在关于类的一节中详细说明。

复制代码
#include <iostream>
#include <cstdio>
using namespace std;

int var = 100;

int main(void)
{
    int var = 50;
    //cout << var << endl;  //输出结果是50,访问的是局部变量
    cout << ::var << endl;  //输出结果是100,访问的是全局变量

    return 0;
}
复制代码

2、new、delete运算符

  ¥new运算符可以用于创建堆空间(类比于C中的malloc和free)

  ¥成功返回首地址(失败的话,返回异常,C++支持异常)

  ¥语法:

    指针变量 = new 数据类型;

    指针变量 = new 数据类型[长度n];

  ¥例如:

    int *p;  p = new int;

    char *pStr = new char[50];

  ¥delete 运算符可以用于释放堆空间

  ¥语法:

    delete 指针变量;

    delete[] 指针变量;

  ¥例如:

    delete p;

    delete [] pStr;

复制代码
#include <iostream>
#include <cstdio>
using namespace std;


int main(void)
{
    int* p = new int(33); //分配一个整数空间4字节,存放的整数是33
    cout << *p << endl;
    int* p2 = new int[10]; //分配连续的10个整数空间40个字节

    delete p;
    delete[] p2;



    return 0;
}
复制代码

 3、new一个新对象

  ¥内存分配(operator new)

    new operator   分配内存 + 调用构造函数

    operator new 只分配内存

    placement new 不分配内存,调用拷贝构造函数

  ¥调用构造函数

 delete 释放一个对象

    ¥调用析构函数

  ¥释放内存(operator delete)

4、重载

  ¥相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载(overload)

  ¥函数重载又称为函数的多态性。(静态的多态,编译时确定函数的入口地址,静态联编。运行时确定函数的入口地址,称为动态联编,通过虚函数来实现,                 发生在,基类与派生类之间)

  ¥函数重载不同形式:

    形参数量不同

    形参类型不同

    形参的顺序不同

    形参数量和形参类型都不同

  ¥调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数。 

  ¥合法的重载的例子:

    int abs(int i);

    long abs(long l);

    double abs(double d);

  ¥非法的重载例子:

    int abs(int i);

    long abs(int i);

    void abs(int i);

  //如果返回类型不同而函数相同,形参也相同,则是不合法的,编译器会报“语法错误”。

复制代码
#include <iostream>
#include <cstdio>
using namespace std;

void fun(int a, int b)
{
    cout << "int fun " << endl;

}

void fun(double a, double b)
{
    cout << "double fun " << endl;

}

int main(void)
{
    fun(3,4);
    fun(3.3,4.4);
    return 0;
}
复制代码

5、name managling 与extern "C"

  ¥name managling 这里把它翻译为名字改编。

  ¥C++为了支持重载,需要进行name managling (名字改编)

  

复制代码
#include <iostream>
#include <cstdio>
using namespace std;

void fun(int a, int b)
{
    cout << "int fun " << endl;

}

void fun(double a);

int main(void)
{
    fun(3,4);
   // fun(3);   //调用重载的fun(double a)函数,无函数体报错如下,编译器在处理重载函数时会将该函数名改为fun@@YAXN@Z
                //    LNK2019    无法解析的外部符号 "void __cdecl fun(double)" (? fun@@YAXN@Z),函数 _main 中引用了该符号    

    return 0;
}
复制代码

 

  ¥extern "C"与C++混合编程

#ifdef __cpluscplus
extern "C"
{
#endif // __cpluscplus
    ...
#ifdef __cpluscplus
}
#endif // __cpluscplus

6、带默认形参值的函数

  ¥函数没有声明时,在函数定义中指定形参的默认值。

  ¥函数既有定义又有声明时,声明时指定默认值后,定义就不能再指定默认值。

  ¥默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。

    void func1(int a, double b = 4.5,int c = 3); //合法

    void func1(int a = 1,double b, int c = 3);  //不合法

  ¥函数调用时,实参与形参从左到右的顺序进行匹配。

复制代码
#include <iostream>
#include <cstdio>
using namespace std;

int fun(int a, int b = 5)
{
    return a + b;

}
int fun1(int a, int b, int c = 6);

int main(void)
{
    cout << fun(3) << endl;
    cout << fun1(3, 4) << endl;

    return 0;
}

int fun1(int a, int b, int c)
{
    return a + b + c;
}
复制代码

 

posted @   今天天气好极了  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示