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