C++ primer(十)--对象和类 共有/私有类访问、 构造/析构函数
2013-10-09 09:43
267 查看
以前都是从C到C++过度的时期,从这开始才是真正的C++精华的开始。OOP的最重要的特性:
抽象
封装和数据隐藏
多态
继承
代码的可重用行
这一文章会设计关于类的所有初级基础知识。关于面向过程编程和面型对象编程解释中一句很关键的话,用户与数据交互的方式有三种:初始化、更新和报告--这就是用户接口。采用OOP方法时,首次从用户的角度考虑对象--描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储,最后,使用新的设计方案创建出程序。
一、抽象和类
类型是什么?指定基本类型完成的三项工作:
决定数据对象需要的内存数量
决定如何解释内存中的位
决定可使用数据对象执行的操作或方法
C++中的类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操作数据的方法组合成一个整洁的包。通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。
类设计尽可能将共有接口与实现细节分开。共有接口表示设计的抽象组件。将实现细节放在一起并将他们与抽象分开被称为封装。数据隐藏(将数据放在类的私有部分中)是一种封装,将实现的细节隐藏在私有部分中,也是一中封装。疯长的另一个例子是,将类函数定义和类声明放在不同的文件中。
对象使用方法时,掉哟个成员函数时,它将使用被用来调用它的对象的数据成员。所创建的每个新对象都有自己的存储空间,英语存储其内部变量和类成员:当同一个类的所有对象共享同一组类方法,既每种方法只有一个副本。在OOP中,调用成员哈数被称为发送消息,因此将同样的消息发送给两个不同的对象将调用同一个方法,但该方法被用于不同的对象。
1)使用类
C++的目标是使得使用类与使用基本的内置类型(int和char)尽可能相同。要创建类对象,可以声明类变量,也可以使用new为类对象分配存储空间按。可以将对象作为函数的参数和返回值,也可以将一个对象赋给另一个。
二、类的构造函数和析构函数
上面红字部分说明了C++的目标,但是目前还不能那样,因为数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员,程序只能通过成员函数来访问数据成员,因此需要设计合适的成员函数,才能成功地将对象初始化(如果使数据成员称为公有,而不是私有,违背了类的一个主要出初衷:数据隐藏),一般来说,最好是在创建对象时对它进行初始化,例如:
Stock gift://Stock 是已经定义的类
gift.buy(10,22);
但是对象的部分成员的值是不存在的,为了更加大众普及化,有一个特殊的成员函数--类构造函数,专门用于构造新对象、将值赋给他们的数据成员。更准确的书,C++为这些成员函数提供了名称和使用语法,而程序员需要提供方法定义。名称与类名相同。Stock类一个可能的构造函数是名为Stock()的成员函数,构造函数的原型和函数头有一个有趣的特征--虽然没有返回值,但没有被声明为void类型。构造函数没有声明类型。
1)声明和定义构造函数
有了构造函数,程序声明对象时,将自动调用构造函数。构造函数的参数名不能和类成员名称一样。
2)使用构造函数
C++提供了两种使用构造函数来初始化对象的方式,第一种就是显示的调用构造函数:
Stock food=Stock("fds",20,12);
另一种是隐式的调用:
Stock gram("fds",34,32);
这种调用方式和上面的显示调用一样。
构造函数的使用方式不同于其他类方法,一般来说,使用对象来调用方法:stock1.show();
但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能通过对象来调用。如果没有任何构造函数,则C++将自动提供默认的构造函数。不做任何工作。当且仅当没有任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,当没有提供默认的构造函数,则下面的声明将出错:
Stock stock1;
如果要创建对象,而不显示地初始化,则碧玺定义一个不接受任何参数的默认构造函数。定义默认构造函数的方式有两种:给已有的构造函数的所有参数提供默认值;一种是通过函数重载来定义另一个构造函数--一个没有参数的构造函数:
Stock();
同时固定只能有一个默认的构造函数,因此不要同时使用上述的两种方式。
3)const成员函数
const Stock lan=Stock("fdsaf");
land.show();
上述方法是不可行的,因为show()的代码无法确保调用对象不被修改--调用对象和const一样,不能被修改。我们以前通过将函数参数声明为const应用或指向const的指针来解决这种问题。但这里存在的无法问题:show()方法没有任何参数。相反,它所使用的对象是由方法调用隐式地提供的。C++的解决方法是将const关键字放在函数的括号后面。
void show() const;
三、this指针
每个类成员函数都设计一个对象,既调用它的对象。但有的时候可能设计到两个对象,在这种情况下需要使用C++的this指针。来直接的:
const Stock & topval(const Stock & s) const;
该函数隐式地访问一个对象,而显示地访问另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改被显示地访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象,由于函数返回两个const对象之一的引用,因此返回类型也应为const引用。
Stock top;
top=stock1.topval(stock2);//函数的作用就是比较对象一个私有成员的大小
隐式地访问stock1,而显示地访问stock2.
[b]const Stock & Stockl::topval(const Stock & s) const[/b]
[b]{[/b]
[b] if(s.total_val>total_val)[/b]
[b] return s;[/b]
[b] else[/b]
[b] return ????;
[/b]
[b]}[/b]
[b] 其中问号的部分怎么办,C++解决这种问题的方法是:使用被称为this的特殊指针。this指针指向用来调用成员函数的对象。这样,函数掉哦那个sock1.topval将this设置为stock1对象的地址,使得这个指针可用于topval()方法。一般来说,所欲的类方法都将this指针设置为调用它的对象的地址。每个成员函数都有一个this指针。this指针指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。可以将上面的问号部分改为*this。[/b]
抽象
封装和数据隐藏
多态
继承
代码的可重用行
这一文章会设计关于类的所有初级基础知识。关于面向过程编程和面型对象编程解释中一句很关键的话,用户与数据交互的方式有三种:初始化、更新和报告--这就是用户接口。采用OOP方法时,首次从用户的角度考虑对象--描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储,最后,使用新的设计方案创建出程序。
一、抽象和类
类型是什么?指定基本类型完成的三项工作:
决定数据对象需要的内存数量
决定如何解释内存中的位
决定可使用数据对象执行的操作或方法
C++中的类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操作数据的方法组合成一个整洁的包。通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。
类设计尽可能将共有接口与实现细节分开。共有接口表示设计的抽象组件。将实现细节放在一起并将他们与抽象分开被称为封装。数据隐藏(将数据放在类的私有部分中)是一种封装,将实现的细节隐藏在私有部分中,也是一中封装。疯长的另一个例子是,将类函数定义和类声明放在不同的文件中。
对象使用方法时,掉哟个成员函数时,它将使用被用来调用它的对象的数据成员。所创建的每个新对象都有自己的存储空间,英语存储其内部变量和类成员:当同一个类的所有对象共享同一组类方法,既每种方法只有一个副本。在OOP中,调用成员哈数被称为发送消息,因此将同样的消息发送给两个不同的对象将调用同一个方法,但该方法被用于不同的对象。
1)使用类
C++的目标是使得使用类与使用基本的内置类型(int和char)尽可能相同。要创建类对象,可以声明类变量,也可以使用new为类对象分配存储空间按。可以将对象作为函数的参数和返回值,也可以将一个对象赋给另一个。
二、类的构造函数和析构函数
上面红字部分说明了C++的目标,但是目前还不能那样,因为数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员,程序只能通过成员函数来访问数据成员,因此需要设计合适的成员函数,才能成功地将对象初始化(如果使数据成员称为公有,而不是私有,违背了类的一个主要出初衷:数据隐藏),一般来说,最好是在创建对象时对它进行初始化,例如:
Stock gift://Stock 是已经定义的类
gift.buy(10,22);
但是对象的部分成员的值是不存在的,为了更加大众普及化,有一个特殊的成员函数--类构造函数,专门用于构造新对象、将值赋给他们的数据成员。更准确的书,C++为这些成员函数提供了名称和使用语法,而程序员需要提供方法定义。名称与类名相同。Stock类一个可能的构造函数是名为Stock()的成员函数,构造函数的原型和函数头有一个有趣的特征--虽然没有返回值,但没有被声明为void类型。构造函数没有声明类型。
1)声明和定义构造函数
有了构造函数,程序声明对象时,将自动调用构造函数。构造函数的参数名不能和类成员名称一样。
2)使用构造函数
C++提供了两种使用构造函数来初始化对象的方式,第一种就是显示的调用构造函数:
Stock food=Stock("fds",20,12);
另一种是隐式的调用:
Stock gram("fds",34,32);
这种调用方式和上面的显示调用一样。
构造函数的使用方式不同于其他类方法,一般来说,使用对象来调用方法:stock1.show();
但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能通过对象来调用。如果没有任何构造函数,则C++将自动提供默认的构造函数。不做任何工作。当且仅当没有任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,当没有提供默认的构造函数,则下面的声明将出错:
Stock stock1;
如果要创建对象,而不显示地初始化,则碧玺定义一个不接受任何参数的默认构造函数。定义默认构造函数的方式有两种:给已有的构造函数的所有参数提供默认值;一种是通过函数重载来定义另一个构造函数--一个没有参数的构造函数:
Stock();
同时固定只能有一个默认的构造函数,因此不要同时使用上述的两种方式。
3)const成员函数
const Stock lan=Stock("fdsaf");
land.show();
上述方法是不可行的,因为show()的代码无法确保调用对象不被修改--调用对象和const一样,不能被修改。我们以前通过将函数参数声明为const应用或指向const的指针来解决这种问题。但这里存在的无法问题:show()方法没有任何参数。相反,它所使用的对象是由方法调用隐式地提供的。C++的解决方法是将const关键字放在函数的括号后面。
void show() const;
三、this指针
每个类成员函数都设计一个对象,既调用它的对象。但有的时候可能设计到两个对象,在这种情况下需要使用C++的this指针。来直接的:
const Stock & topval(const Stock & s) const;
该函数隐式地访问一个对象,而显示地访问另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改被显示地访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象,由于函数返回两个const对象之一的引用,因此返回类型也应为const引用。
Stock top;
top=stock1.topval(stock2);//函数的作用就是比较对象一个私有成员的大小
隐式地访问stock1,而显示地访问stock2.
[b]const Stock & Stockl::topval(const Stock & s) const[/b]
[b]{[/b]
[b] if(s.total_val>total_val)[/b]
[b] return s;[/b]
[b] else[/b]
[b] return ????;
[/b]
[b]}[/b]
[b] 其中问号的部分怎么办,C++解决这种问题的方法是:使用被称为this的特殊指针。this指针指向用来调用成员函数的对象。这样,函数掉哦那个sock1.topval将this设置为stock1对象的地址,使得这个指针可用于topval()方法。一般来说,所欲的类方法都将this指针设置为调用它的对象的地址。每个成员函数都有一个this指针。this指针指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。可以将上面的问号部分改为*this。[/b]
相关文章推荐
- C++ Primer 5th: 拷贝构造函数为什么可以访问传入对象的私有变量
- PHP面向对象1.3对象中成员的访问和构造析构函数
- 通过私有构造方法创建对象(转)
- c++ primer 13.13练习(构造,拷贝,析构函数何时发生详解)
- C++函数返回值为对象时,构造析构函数的执行细节
- C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)
- OC基础day4-继承,self,super,多态,类对象,SEL类型,description,私有方法与私有变量,三种访问限制
- java中,方法可以访问他的类对象的任何私有特性
- 因为成员函数属于同一个类的所有对象,所以在成员函数内可以访问同类其他对象的私有成员是合理的
- 内部类是如何访问外部类私有对象的
- iOS开发笔记之七十——如何访问对象的私有方法和变量
- 本类的方法可以访问本类的任何一个对象的私有域、
- C++之在类内部访问对象的私有成员
- 关于类成员函数中访问同类对象的私有成员
- 拷贝构造函数的一个对象访问私有成员的问题
- Python,构造析构函数,文档字符串方法,类的变量与对象的变量
- C++私有成员变量被对象直接访问
- 关于类成员函数中访问同类对象的私有成员
- c++访问权限之构造和析构函数说明
- 类和对象—类外访问私有数据