C++之类

来源:互联网 发布:淘宝司法拍卖几次 编辑:程序博客网 时间:2024/05/26 15:54

一,类的概念


类的四大特性:Abstraction(抽象),Polymorphism(多态),Inheritance(继承),Encapsulation(封装)。

对象具有唯一的特征,状态和行为。

同类型的对象用一个通用的类来定义。对象是类的实例。

class C{int p;int f()};C ca;

A class uses variables(变量) to define data fields(定义数据域)andfunctions(函数)todefine behaviors(定义行为)。

Additionaly,a  class provides a special type of functions,known as constructors,which are invoked to construct objects from the class.(类中有一种特殊的“构造函数,在创建对象时自动被调用”)


类的基本定义:

class Circle{public://若去掉public,所有成员都会变成私有的,之后无法访问   double radius;//data field,在C++ 11标准中,非静态的数据成员才可在数据域中进行初始化   Circle(){      radius = 1;}//constructors,其名字与类的名字相同,无返回值     Circle(double newRadius){      radius=newRadius;}//constructors,与前一个构造函数构成重载现象   double getArea(){      return radius*radius*3.14159;}//function,由于类是将数据和函数封装在一起,此时无需传递参数来读取数据,直接访问类中的数据域成员。};//类中分号不可省

类中可不声明构造函数,如果不声明,编译器会提供一个带有空函数体的无参构造函数,称之为“默认构造函数”

二,创建对象访问对象成员

创建对象:

1.无参数:className objectName;如Circle circle1;

2.带参数:className objectName(arguments);如Circle circle2(5.5)


访问对象成员,即对象中的数据和函数

使用对象访问运算符  .   来访问对象的数据域和函数

如果想用对象指针访问对象的数据和函数,该用->运算符。


三,关于创建对象的更多细节

声明一个自定义的类时,类名中的首字母大写;c++标准库里的类名是小写。
用基本数据类型定义变量,用类名定义对象。
用赋值运算符“=”进行成员拷贝,默认情况下,对象中的每个数据域都被拷贝到另一对象的对应部分。但不是同一个对象。

匿名对象:有时需要创建一个只用一次的对象,此时无需给对象命名,此时类名叫做匿名对象。如:ClassName();ClassName(arguements)。

struct结构体中的成员默认访问控制属性是public的,而class里的成员默认访问控制属性是private的。


四,将声明与实现分开

头文件(.h)中包含类的声明,类里的声明包含各成员的声明,但不包含实现,实现在.cpp文件里进行,最后在主函数中对其进行类的使用,但主函数中需要包含其头文件。
类实现形式: FunctionType ClassName::FunctionName(Arguments){...}
由于构造函数没有返回值,所以构造的实现就省去了其类型。
在类中声明定义一个函数,它将自动变成内联函数。如果在类中声明,但在类外定义,则不会变成内联函数。


五,对象指针与动态对象

在函数中声明的对象叫做局部对象,在栈上创建,当函数返回时,对象被销毁。为保留对象,可以用new运算符在堆上创建对象。
语法结构:ClassName *pObject =  new ClassName();//用无参构造函数创建对象;
                    ClassName *pObject =  new ClassName(arguments);//用有参构造函数创建对象;
程序结束时,程序员需手动销毁它,即使用delete函数。


六,C++字符串类

c++使用string类来处理字符串。
string类中的函数:构造;追加;赋值;位置与清除;长度与容量;比较;子串;搜索;运算符。
很多string的函数接受两个数字参数:index,n。    index:从index号位置开始;n:之后的n个字符。

创建string对象:用无参构造函数创建一个空字串,如string newstring;
                              由一个字符串常量或者字符串数组创建string对象,如 string message(“Aloha world”)或者char charArray[ ]={'H','e','l','l','o','\0'};string message1(charArray);

追加字符串:一系列的重载函数可以将新内容附加到一个字符串。append函数;

为字符串赋值:一系列重载函数可以将一个字符串赋以新内容。assign函数;

比较字符串:用于比较两个字符串。compare函数,s1.compare(s2)用s1-s2;

搜索字符串:在一个字符串中搜索一个子串或者一个字符。find(子串/字符,n),从n号位置开始往后搜索,若出现,返回子串出现的第一个位置,若不出现返回-1;

插入和替换字符串:将某个字符或者字符串插入到当前字符串的某个位置,insert(index,str);
                                    将本字串从某个位置开始的一些字符替换为其他内容,replace(index,n,str);

at(index):返回当前字符串中index位置的字符,用于获取一个单独的字符;substr(index,n)用于获取一个子串。

clear():清空字符串;
erase(index,n):删除字符串从index开始的n个字符;
empty():检测字符串是否非空。


七,数据域封装

数据域采用public形式的两个问题:数据会被类外的方法篡改;使得类难于维护,易出现bug。
为读写私有数据,需要get/set函数。
get函数一般原型:returnType  getPropertyName();布尔型get函数的原型:bool  isPropertyName();set函数的原型:void setPropertyName(dataType propertyValue)

访问器getter与更改器setter应该放置在public的区域内。


八,变量作用域和this指针

 同名屏蔽:若成员函数中的局部变量与某数据域同名,局部变量优先级高,同名数据域在函数中被屏蔽。

为避免混淆,不要在类中多次声明同名变量,除函数参数外。


this 指针:特殊的内建指针;引用当前函数的调用对象。可解决同名屏蔽问题。

另外,可以通过私有类成员变量名应有下划线后缀来避免同名屏蔽。(编码规范)

  

九,对象作为函数参数

按值传递:将实参的值拷贝到形参里来;
按引用传递:声明了一个别名;
用指针方式传递对象参数:传递地址。
指针与引用的区别见http://blog.csdn.net/listening_music/article/details/6921608

十,对象数组

若只声明对象数组,则会自动调用默认无参构造函数;若声明时初始化,会将初始化中的各匿名对象的值赋给数组的每个对象元素。

Circle* p = new Circle[3];释放内存的代码是        delete [] p;


十一,类的抽象与封装

类抽象:将类的实现与使用分离开,类创建者提供类的描述(类的原型声明),使用者不需要知道类是如何实现的。
类封装:类实现的细节被封装起来,并对用户是隐藏的。


十二,构造函数初始化列表

构造函数初始化:在构造函数中用初始化列表初始化数据域。
在c++03标准中数据域在声明时不能赋初值的,数据域必须通过其他方式初始化。而在c++11标准里是可以在声明时进行初始化的。

用法形式:ClassName ( parameterList ):dataField(value1),dateField(value2){//somthing to do}

例:Circle::Circle():radius(1){      },这和Circle::Circle(){radius=1;}是一样的。     但仅在由基础数据类型来定义类的对象的数据域成员,两者一样。

需要初始化的原因:若类的数据域是 一个对象类型,在构造函数的函数体执行之前,数据域这一成员必须已经构造并初始化完成,否则无法使用。


默认构造函数的角色:
如果类的数据域是一个对象类型;该对象的无参构造函数会被自动调用,若没有无参构造函数,则编译器报错,此时可在初始化列表中手工构造对象。
0 0
原创粉丝点击