重拾C++
引用定义:
int a=10;
int &b=a;对
int &c;错
引用声明时必须初始化。
对于不同类型数据间的引用只能是conse类型的,
double a=9.3 ; const int &b=a;对(相当于 int tmp=a;const int &b=tmp);
double a=9.3;int &b=a;错
类定义:
class 默认成员为private类型的
struct 默认成为为public类型的
定义一般不放在头文件中,声明可以放在头文件中(C++ primer简称cp 100),因为头文件可能被很多包含如果是包含定义会出现重复定义的情况。但是头文件可以包含定义类,const必须是被常量表达式定义 (c p,100有详细的说明)
对于字符串的链接来说:必须要是string类在前面,不能像python一样连接
对于Vector来说,需要根据类的构造函数调用相应的初始化函数。定义vector size 的情况需要要加上<int>例如下面vector<int>::size_type
vector<int> ivec;
ivec[1]=10;错------下标无法添加元素
定义迭代器:
vector<int> ::iterator iter=ivec.begin()
*iter ===ivec[index]
const_iterator指只借助迭代器读,不需要写
可以使用const_cast 可以将在类型传化时将const性质去掉
在类中定义并且声明的函数默认为内联函数
函数重载时要注意的是:
如果只是函数的返回值不变 ,不是函数的重载,而是重复声明是错误的
使用同一个ifilestream.open()函数打开文件时,需要在上次结束时先调用close() 还有clear()清除标志位,这样才能正常的使用
关于类定义与声明:
因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成
员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是
指向自身类型的指针或引用:
在类函数返回的为一个类的应用,需要使用return *this;函数类型一个为const另外一个为发const也是函数的重载
编译器按照成员声明在类中出现的次序来处理它们。通常,名字必须在使用
之前进行定义。而且,一旦一个名字被用作类型名,该名字就不能被重复定义:
typedef double Money;
class Account {
public:
568
Money balance() { return bal; } // uses global definition of
Money
private:
// error: cannot change meaning of Money
typedef long double Money;
Money bal;
// ...
};
explicit Sales_item(const std::string &book = ""):
isbn(book), units_sold(0), revenue(0.0) { }如果没有explict的话,如果有个函数a(Sales_item),并且调用时为a(string)这时会默认调用构造函数构造出一个临时的对象,传给函数,但是如果使用explicit 形容的构造函数是无法自动生成临时对象的
有时(但不是很经常),我们希望类的数据成员(甚至在 const 成员函数
内)可以修改。这可以通过将它们声明为 mutable 来实现。
可变数据成员(mutable data member)永远都不能为 const,甚至当它是
const 对象的成员时也如此。因此,const 成员函数可以改变 mutable 成员。
要将数据成员声明为可变的,必须将关键字 mutable 放在成员声明之前:
关于类中命名的问题:
当成员定义在类定义的外部时,名字查找的第 3 步不仅要考虑在 Screen
类定义之前的全局作用域中的声明,而且要考虑在成员函数定义之前出现的全局
作用域声明。例如:
记住,可以初始化 const 对象或引用类型的对象,但不能对它们赋值。在
开始执行构造函数的函数体之前,要完成初始化。初始化 const 或引用类型数
据成员的唯一机会是构造函数初始化列表中。编写该构造函数的正确方式为
// ok: explicitly initialize reference and const members
577
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) { }
对于protected 的成员来说,在派生类中只能用派生类的对象调用。不能再派生类中用基类调用
对于友元来说是可以访问private形容的函数或者变量的
所谓的动态绑定代表的是可以通过基类,调用相应的派生类中的函数。这样可以实现一个函数,来动态调用很多函数的情况。
在继承中,在public后使用 class Base
{
public:
std::size_t size()const;
protected:
std:size_t n;
}
class dedrvied :private base{ }//这种情况下size()这个函数是Private,不能被外界直接调用。
如果使用
class dedrivide:private base{
public:
using base::size;//强制将其定义为public类型的
protected:
using base::n;
注意到:
友元函数时不能被继承的。
应该注意在对象转换的过程中:
1.基类和派生类之间的继承访问原则影响很大,使用Public可以直接完成转化,是private 无法完成转换,是protected 可以完成转换。
需要在派生类中使用基类的构造函数初始化基类的成员。
在使用模板时
template<typename T,class u>
typename 和class 都可以使用
还是需要注意的是在
使用了typedef struct aa{
int a;
int b;
}aa后 ,可以使用 (aa){3,4}生产一个临时的变量
运算符重载 :
(1)运算符重载函数作为类的友元函数的形式:
class 类名
{
friend 返回类型 operator运算符(形参表);
}
类外定义格式:
返回类型 operator运算符(参数表)
{
函数体
}
在类内必须要声明为friend类型的数据才可以 。
在类外的定义参数
对vitual函数的理解:
posted on 2013-07-28 22:40 Practicer.. 阅读(179) 评论(0) 收藏 举报
浙公网安备 33010602011771号