0. 如果没有指明访问限定符(public,private),class中默认的private,而struct中的成员默认是public的。

#include <iostream>

using namespace std;

int main()
{
    cout<<"Hello world"<<endl;
    return 0;
}

变量类型名:typeid(T).name()。

1. 存储

类的对象中只保存非静态成员变量,不保存成员函数,sizeof求得的大小只是非静态成员变量占用的空间。

只有非静态成员变量才属于类的对象上。

成员函数不占用对象空间,所有函数共享一个函数实例。

C++中定义的struct无成员时,也占用一个字节;而在C语言中不占用空间。

2.命名空间namespace

using namespace std;声明后,该命名空间的函数可直接调用。

函数前可不加命名空间,std::cout, std::endl。

此外,程序有一个默认的无名命名空间,若调用全局变量,可::cout(默认的无命名空间函数或变量)。

3.C++中定义了布尔类型

bool类型变量可赋值为true或false。

4.引用类型

数据类型 &别名 = 原名;

引用相当于为某个变量起一个别名,不占用存储空间,注意引用操作的是变量,不是常量。

#include <iostream>

using namespace std;

int main()
{
    int m = 10;
    int& n = m;

    cout << "addr of m is " << &m <<endl;
    cout << "addr of n is " << &n <<endl;

    return 0;
}
// addr of m is 0x7fff53d3e1ac
// addr of n is 0x7fff53d3e1ac

规则:

1)引用被创建的同时必须初始化(指针则可以在任何时候初始化)。

2)不能有NULL引用,引用必须与合法的存储单元关联。

3)一旦引用被初始化,就不能改变引用的对象。

int &ref = 10; 错误,引用本身需要一个合法的内存空间。

const int &ref = 10;正确,编译器优化代码,int tmp = 10; const int &ref = tmp;

应用
引用的主要功能是传递函数的参数和返回值。

void swap(int &x, int &y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

传引用,实为传变量本身。

char arr[10] = {'a', 'b', 'c'};
char & foo(int i)
{
    return arr[i];
}

foo(1) = 'h';

引用可以作为函数的返回值存在,注意函数不能返回局部变量引用。

引用作函数的返回值,可以作左值。若不想其做左值,可加const修饰。

常量引用

主要用来修饰形参,防止误操作。在函数形参列表中,可以加const修饰形参,防止形参改变实参。

引用的本质

应用的本质在C++内部实际是一个指针常量,但是所有的指针操作编译器都帮我们做了。

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <string>

using namespace std;

// 编译器发现是引用,转换为 int *const ref = &a
void func(int &ref)
{
    ref = 100; // ref是引用,转换为*ref = 100
}

int main()
{
    int a = 10;

    //自动转换为int *const ref = &a; 指针常量指向不变,指向的值可以改变
    int &ref = a;
    ref = 20;  // 内部发现ref是引用,自动帮我们转换为:*ref = 20

    cout << "a = \t" << a << endl;
    cout << "ref = \t" << ref << endl;

    func(a);
    cout << "a = \t" << a << endl;
    cout << "ref = \t" << ref << endl;

    return 0;
}
-----------------------------
a =     20
ref =   20
a =     100
ref =   100
引用的本质是指针

相关文章: