哪些网站不能备案,大潮建设集团有限公司 网站,做淘宝一件代发的网站,编程培训班网上课程“学习是人类成长的喷泉。” - 亚里士多德 文章目录 内联函数对象的方法和属性构造函数和析构函数构造函数的种类使用构造函数析构函数列表初始化 const成员函数this指针对象数组类作用域作用域为类的常量类作用域内的枚举 内联函数
定义位于类声明中的函数自动成为内联函数。… “学习是人类成长的喷泉。” - 亚里士多德 文章目录 内联函数对象的方法和属性构造函数和析构函数构造函数的种类使用构造函数析构函数列表初始化 const成员函数this指针对象数组类作用域作用域为类的常量类作用域内的枚举 内联函数
定义位于类声明中的函数自动成为内联函数。有两种方法可以成为内联函数
将函数定义置于类声明。在类定义中加上inline关键字。
注意只有足够短小的函数才能被当作内联函数处理。当一个函数被定义为内联函数时编译器在调用这个函数不会真正进入到这个函数中而是直接用函数体来替换函数名进行处理这样就省去了进入函数所花费到时间开销但因为这种处理方式需要编译器对代码重新进行编译所以只有足够简单的函数才能作为内联函数。上一篇文章中的set_tot()函数就是内联函数。
对象的方法和属性
系统为每一个对象分配一块存储空间这个空间内分配着这个对象的属性值但方法并不存在这块空间中作为所有对象的公用代码段它单独存在一块空间中并被所有对象一起调用。详细解释将留给下文现在只需知道方法和属性不共同存储在一个地方即可。
构造函数和析构函数
为了让对象在构建的时候顺便完成指定的行为比如打印提示语或进行属性变量的初始化我们可以自己在类中写构造函数。 构造函数在构造对象时自动调用一个类中必须有构造函数如果程序员没有自己编写编译器会帮程序员加上一个默认构造函数
class Stock
{//编译器默认添加的构造函数Stock(){};
};构造函数有两个特征
函数名与类相同没有返回值
构造函数的种类
构造函数可分为三类
默认构造函数即编译器自动加的函数。带参数的构造函数顾名思义带有参数。
class Stock
{int i_;//沿用书中的命名习惯在属性最后加一个下划线//带有参数的构造函数Stock(int i){i_i;//可以像普通函数一样使用传入的参数};//可以写不止一个构造函数也就是构造函数重载Stock(float i){couti;//这次没有用参数初始化而是直接打印了}
};拷贝构造函数传入一个该类的对象作为参数。
class Stock{int i_;//以一个该类Stock类的对象作为参数Stock(Stock s){i_s.i_;//利用.运算符调用所传入对象的属性进行初始化couts.i_;//当然也可以打印}
}在编写构造函数时如果想编写第二种和第三种构造函数则必须先编写默认构造函数且此时编译器不会自动提供默认构造函数。 注意给构造函数传参时不要让参数名和属性变量名一致这个原则和使用普通函数一样这个错误对于新手来说真的很隐蔽而易犯
使用构造函数
C有两种使用构造函数的方式
int main(void){//第一种通过显式调用来使用构造函数Stock foodStock(42);//第二种隐式调用构造函数Stock food2(42);//和上面的第一种调用等价//注意如果想隐式调用默认构造函数不能加圆括号Stock food3;//隐式调用默认构造函数return 0;
}注意第二种调用方法是构造函数独有的其他方法不能用这种方式。 构造函数也可以在赋值时使用
int main(void){//利用构造函数进行初始化Stock foodStock(42);//利用构造函数进行赋值foodStock(42);
}析构函数
析构函数比构造函数简单的多它负责告诉编译器这个对象已经使用完毕可以被回收。唯一值得一提的是构造函数也可以在函数体中进行一些操作。
class Stock{int i;~Stock()//虽然要对所有属性变量进行回收但函数体中不应有对属性变量的删除操作编译器会自动回收{coutthis stock is destroy//可以进行打印couti;//可以使用属性变量}
}析构函数特点和构造函数相同它的名字是类名前加一个~。 在代码中程序员不显式调用析构函数什么时候调用析构函数由编译器自己决定。
列表初始化
这实际上是C11中引入的另一种隐式调用构造函数的方式。尽管方便但笔者并不习惯使用只能说仁者见仁吧。
int main(void)
{//隐式调用带参数的构造函数注意要使用大括号Stock hot_tip{42};//隐式调用默认构造函数Stock hot_tip1{};
}const成员函数
当一个函数已经被程序员确认不会修改调用它的对象时应该把它声明为const成员函数。当一个函数被声明为const成员函数时编译器将知道这个函数不会修改对象这将提升代码的可读性并规避一些令人迷惑的错误。
this指针
this指针指向调用这个指针的对象本身函数传入另一个对象时这个指针会派上用场
class Stock{int i;Stock larger(Stock s){if(is.i)return s;//第一个i是调用这个函数的对象的属性i因此可以写成this-ielse return *this;//this是指向对象的指针因此*this就是这个对象本身}
}对象数组
和默认类型一样对象也可以以数组的形式同时声明多个
class Stock{int i;Stock();//默认构造函数Stock(int s);//带参数的构造函数}
int main(void)
{int a[3]{3,2,1}这是int类型声明数组的方式Stock对象数组大同小异Stock s1[3]{Stock(),//第一个对象使用默认构造函数Stock(3),//第二个对象使用带参数构造函数Stock(),//第三个对象使用默认构造函数};
}对象数组进行初始化时首先使用默认构造函数创建数组元素然后再用大括号中的构造函数创建临时对象最后将临时对象复制进数组元素中。
类作用域
在C中类的成员作用域都为该类在类外使用这个类的成员时需要加上直接成员运算符.间接成员运算符-或作用域解析运算符::
class Stock{int i;Stock();//默认构造函数Stock(int s);//带参数的构造函数void show();}
//下面的函数是show方法的定义
Stock::show(){...};//::为作用域解析运算符
int main(void)
{Stock s;s.show();//.为直接成员运算符Stock* sps;sp-show();//-为间接成员运算符
}只需要知道类中的成员在类外使用时不能直接用要加点什么就可以了。至于应该加什么代码写多了自然就可以自己辨别。
作用域为类的常量
有些常量由类的所有对象共享这种常量可以用来表示所有对象都需要共同维护的一个信息。有两种方式声明这种变量枚举和static关键字
class Stock{enum{Months12}//使用枚举的方法声明常量static const int date30;//使用static的方法声明常量类作用域内的枚举
传统的枚举在同一个作用域中会有冲突
enum egg{small,medium,large};
enum t_shirt{small,medium,large};这种情况下无法通过编译但如果使用类作用域的枚举就可以解决这个问题
enum class egg{small,medium,large};
enum class t_shirt{small,medium,large};使用枚举量时要用::运算符
egg eegg::small;但要注意枚举量并非int类型不能进行隐式类型转换但显式类型转换也是允许的
int iegg::large;//不能通过编译
int a(int)egg::large;//可以通过编译枚举量的底层类型未知取决于实现但依然可以使用以下语法指定底层类型在short,int等整型类型中指定
enum class : short pizza{small,medium,large};//在class后加:short我是霜_哀在算法之路上努力前行的一位萌新感谢你的阅读如果觉得好的话可以关注一下我会在将来带来更多更全面的知识讲解