自动对象:只存在于块执行期间的对象叫做自动对象,当块的执行结束后,块中创建的自动对象的值就变成未定义的了。
局部静态对象:在程序第一次经过对象定义语句时初始化,并到程序终止才被销毁。
size_t count_calls()
{
static size_t ctr=0;//被定义了以后一直有效,而不是每次都被初始化为0
return ++ctr;
}
int main()
{
for(size_t i=0;i!=10;++i)
cout<<count_calls()<<endl;//打印从1-10
return 0;
}
地址传递和引用传递:地址传递还会给指针分配一个地址,但是引用不会,是指向指向那个地方。引用不用拷贝
因为数组不能拷贝,所以函数不能返回数组。
class 和struct区别默认的访问权限,class是private,struct是public。
而类外函数要调用类内成员要记得加friend,在类内集中声明。
inline函数:当程序运行时,是将形参、函数体等压入栈中,如果调用的函数使用频率比较频繁,那么在函数调用的花销上就会比较大,这个时候就可以在调用函数定义之前加上inline字符,类似于C语言中的宏展开。(相当于替换?)但是只适合小而使用频繁的函数。
explicit:如果不希望发生隐式转换就用上explicit,这样可以避免发生预期外的函数使用。只允许在类内构造函数声明。只能用于直接初始化,而非拷贝初始化。
Sales_data item1(null_book);//正确,直接初始化
Sales_data item2=null_book;//错误,拷贝初始化
IO库
IO对象无拷贝或复制,读写IO对象会改变其状态,因此传递和返回引用不能是const的。
ofstream ofs1,ofs2;
ofs1=ofs2;//不能给流对象赋值
ofstream print(ofstream);//错误:不能初始化ofstream对象
out2=print(out2);//不能拷贝流对象
而输入状态要保持一直正确才能读到值,要不然后面都读不到。
static和const
static作用:控制变量的存储方式和可见性
作用一:修饰局部变量。存放在静态存储取,声明周期延续至程序运行结束,但是作用域没有改变,作用域还是在语句块中。
作用二:修饰全局变量。全局变量的话,加了extern声明那么其他文件也可以看到,不过static只有本文件可以。
作用三:修饰函数,和修饰全局变量类似。
作用四:修饰类,表示该函数属于一个类而不是某一个特定对象。(静态非常量数据成员,只能在类外定义和初始化)
作用五:类成员/函数声明。static成员函数不能被virtual修饰,静态成员没有this指针
const:修饰基本数据类型就表示变量不可改,修饰指针分为指针常量和常量指针。
const在类中,表示某个对象声明周期里是常量。
*:静态函数:所有对象共享一个函数,静态成员函数只能访问静态成员变量,
class Person
{
public:
static void func()
{
cout<<"静态成员函数"<<endl;
m_a=100;//正确
m_b=20;//错误,静态函数不能访问非静态成员变量 没法区分是哪个对象的m_b
}
static int m_a;//类内声明
int m_b;
};
int Person::m_a=0;//类外定义
void test01()
{
Person p;
p.func();
//通过类名访问
Person::func();//不用声明对象,因为不属于任何一个对象
}