C++语法基础(A)- 概述和引用

本文详细介绍了C++编程的基础知识,包括HelloWorld示例、面向对象编程、命名空间的使用、using声明、C++对C语言的增强、引用的语法、以及常量和函数的引用规则。

概述和引用

(一) helloworld

#include <iostream>     //标准输入、输出流  input ----输入;output ----输出; stdio
using namespace std;    //标准命名空间 
int main()              //程序入口函数
{
    cout << "hello world" << 12334 << endl;//cout 标准输出流,endl是输出换行并刷新缓冲区
    system("pause");// 阻塞
    return EXIT_SUCCESS;
}
  1. C++编程的两大思想:面向对象、泛型编程
  2. C++面向对象的三大特性:封装、继承、多态
  3. ::作用域运算符——当::前没有任何作用域情况下,代表使用全局作用域

(二)namespace的使用

  • 用途:解决命名冲突
  • 使用:存放变量、函数、结构体、类等。。。
  • 声明:必须声明在全局作用域下🌟
  • 命名空间可以嵌套命名空间
  • 命名空间是开放的(合并),可以随时向命名空间添加新成员
namespace B
{
    int m_A = 20;
}
namespace B
{
    int m_B = 50;
}
  • 命名空间是可以匿名的,相当于在变量前加了一个关键字static
    • 静态static的特性:
      1. 生命周期;
      2. 只能在本文件中使用
namespace 
{
    int m_C = 50;// static int m_C = 50;
}
  • 命名空间是可以起别名的
namespace veryLongName
{
    int m_A = 0;
}
namespace veryShortName = veryLongName;//起别名

(三)using声明和using编译指令

namespace k
{
    int s = 1;    
}
void test1()
{
    //注意:当using声明和就近原则同时出现时,需要避免二义性
    int s = 2;
    using k::s;//using声明
    cout << s << endl;
}
void test2()
{
    //注意:当using编译指令和就近原则同时出现时,优先使用就近原则    
    int s = 2;
    using namespace k;//using编译指令
    cout << s << endl;
}

(四)C++对C语言增强

1. 全局变量检测增强

全局变量重定义

2. 函数检测增强

  • 形参变量类型检测
  • 形参传入个数检测
  • 函数的声明的返回值检测
  • 函数返回值检测

3. 类型转换检测

void test()
{
    char *p = (char*)malloc(64);//(char*)在C语言中可以没有,在C++语言中不能丢失
}

4. struct增强

    struct Person()
    {
        int age;
        void func(); //C语言的struct中不能放函数;C++语言的struct中可以放函数        
    }
    void test()
    {
        /*struct*/ Person p;//C语言声明结构体时必须加struct;C++语言下声明结构体可以不加struct
    }

5. bool类型的增强

C语言中没有bool类型;

6. 三目运算符增强

    int a = 10;
    int b = 20;
    *(a > b ? &a : &b) = 100; 
    a > b ? a : b = 100;//在C语言中检测错误(显示表达式必须是可以修改的左值);在C++中可以通过;
    //原因:C语言中三目运算符返回值;C++语言中三目运算符返回变量

7. const增强

  • 全局const修饰变量:收到常量区保护,及时语法通过,运行也会报错
const int m_A = 100;//全局const
void test()
{
    m_A = 200;//直接修改:C和C++都会语法错误
    //间接修改:(都不能修改)
    int *p = &m_A;//C语言通过;C++语法不通过
    int *p = (int*)&m_A;//C++语法通过
    *p = 200;//都是运行报错
}
  • 局部const修饰变量
void test()
{
    const int m_B = 100;//局部const
    //---------(1)
    int *p = &m_B;//C语法通过;C++语法不通过,会出现(const int* 不能初始化 int*)
    int *p = (int*)&m_B;//C++语法通过
    //---------(2)
    *p = 200;//C语言可以修改;C++语言无法修改,但不报错(因为取地址时,会产生临时变量)
    //---------(3)
    int arr[m_B];//C语法不可以初始化数组;C++可以(相当于常量)
}
  • const修饰的全局变量在C语言中默认的是外部链接(变量可以在其它文件中使用)
  • const修饰的全局变量在C++语言中默认的是内部链接(变量只能在当前文件使用),需要用extern来提高全局变量的作用域

const分配内存情况

  1. const修饰的变量取地址时
  2. const前加入extern修饰后时
  3. 使用变量初始化const修饰的变量时
void test()
{
    int a = 10;
    const int m_A = a;
    int *p = (int*)&m_A;//会分配内存
    *p = 20;//可修改
}
  1. 对于自定义数据类型使用const
struct Person
{
    string name;
    int age;
};
void test()
{
    const Person p;//通过指针可以修改,不能直接修改
    Person **pp = (Person *)&p;//会分配内存
    pp.name="bbb";//不可以修改
    pp->name = "aaa";//可修改
    pp->age = 10;
}

尽量使用const代替#define

  1. const有类型,可进行编译器类型安全检查;#define无类型,不可进行类型检查
  2. const有作用域;而#define不重视作用域,默认定义处到文件结尾,如果定义在指定作用域下有效的常量,那么#define就不能用

(五)引用基本语法

1. 用途:给变量起别名

2. 语法:Type &别名 = 原名;

3. 引用必须初始化,一旦初始化,就不能改变指向

4. 引用的本质

在C++内部实现是一个指针常量,引用所占空间大小与指针相同

Type& aRef = val;//自动转换Type* const ref = &val,这也能说明引用为什么必须初始化

5. 对数组的引用

//方式一
int arr[10];
int (&pArr)[10] = arr;
//方式二
//先定义数组别名,再定义引用
typedef int(ARRAY_TYPE)[10];
ARRAY_TYPE &pArr2 = arr;

6. 函数的引用

a.参数的引用(参数传递)
  • 值传递
  • 地址传递
  • 引用传递
b. 返回值的引用
  • 函数的返回值不要是返回局部变量的引用
  • 如果函数的返回值是一个引用(返回static修饰的变量),那么这个函数可以作为左值进行运算

7. 指针的引用

struct Person
{
    int age;
};
void allocateSpace(Person *&p)
{
    p = (Person*)malloc(sizeof(Person));
    p->age = 100;
}
void test()
{
    Person *p = NULL;
    allocateSpace(p);
}

8. 常量的引用

  • 引用必须引一块合法的空间;但是加入const之后,语法就通过了。
int &ref = 10;//错误
const int &ref = 10;//正确,编译器优化,类似于 int temp = 10; const int &ref = temp;
  • 使用场景(常用于函数)
void showValue(const int &a)
{
    a = 1000;//参数中有const,所以报错
}
void test()
{
    int a = 100;
    showValue(a);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值