c++类与初始化,const
- --c++类与初始化,const
- --------------------------------2014/09/04
- 1. 类的定义(头文件、声明文件)看成类的外部接口,一般写成.h头文件。
- 2. 类的成员函数定义(源文件)看成类的内部实现,一般写成.cpp/.cc文件。
- --成员函数定义
- 返回值 类名::函数名(参数列表) {
- 函数体;
}
- ---------------------------------------------------
- --类定义
- class 类名 {
- 成员变量
- 成员函数
- }; --注意这里有分号,否者报错:error: new types may not be defined in a return type
- --------------------------------------------------
- 看一个简单的例子:
- student.h
- #include<string>
- using namespace std;
- class student
- {
- public:
- void set_name(string v_name);
- void set_age(int v_age);
- void set_school_name(string v_school_name);
- string get_name(); int get_age();
- string get_school_name();
- private:
- string name;
- int age;
- string school_name; };
- student.cc
- #include "student.h"
- void student::set_name(string v_name)
- { name=v_name; }
- void student::set_age(int v_age)
- { age=v_age; }
- void student::set_school_name(string v_school_name)
- { school_name=v_school_name; }
- string student::get_name()
- { return name; }
- int student::get_age()
- { return age; }
- string student::get_school_name()
- { return school_name; }
- main.cc
- #include<iostream>
- #include "student.h"
- using namespace std;
- int main(int argc,char *argv[])
- {
- student *a=new student();
- a->set_name("Jack");
- a->set_age();
- a->set_school_name("Haford");
- cout<<a->get_name()<<" "<<a->get_age()<<" "<<a->get_school_name()<<endl;
- }
- 编译源文件
- [root@localhost student]# g++ -o main main.cc student.cc --源文件编译
- [root@localhost student]# ./main Jack Haford
- 构造参数的使用:
- #include<iostream>
- using namespace std;
- class tangle{
- int x;
- int y;
- public:
- tangle();
- tangle(int x,int y);
- void set_x(int x);
- void set_y(int y);
- int get_x() {return x;}
- int get_y() {return y;}
- }; --注意分号
- tangle::tangle() {
- x=;
- y=;
- }
- tangle::tangle(int x,int y) {
- this->x=x; --this为指向自己的指针,不同于java的引用。
- this->y=y;
- }
- void tangle::set_x(int x) {
- this->x=x;
- }
- void tangle::set_y(int y) {
- this->y=y;
- }
- int main(int argc,char* argv[]) {
- tangle a(,);
- tangle *b=new tangle(); --new创建一个对象,返回指针
- cout<<"a: "<<a.get_x()<<" "<<a.get_y()<<endl;
- cout<<"b: "<<b->get_x()<<" "<<b->get_y()<<endl;
- return ;
- }
- 类成员函数const
- 一个函数名字后有const,这个函数必定是成员函数,也就是说普通函数后面不能有const修饰,如:int print( ) const {.......} 这个函数必定为成员函数,即在类里面定义的函数。
- 在一个类里定义了一个const成员函数后,则此函数不能修改类中的成员变量,如果定义了一个类的const对象(非const对象可以调用const成员函数和非const成员hanshu ),它只能调用类中的const成员函数,如:
- class text{
- public:
- void print_const(void) const { cout<<"hello"<<endl;} //有const修饰
- void print(void) {cout<<"hello"<<endl;} //没有const修饰
- void getk(void) const {k=; } //错误,有const修饰,不能修改k的值,
- private:
- int k;
- };
- const text a;
- int main()
- {
- a.print(); //错误,const对象只能调用
- a.printf_const(); //正确
- }
- // void print() const {} 和 void print() {} 是重载函数,假如对象为const,则调用void print () const成员函数,如果为非const,则调用void print() ;
- class text{
- public:
- void print(void) const {cout<<"hello_const"<<endl;}
- void print(void) {cout<<"hello"<<endl;}
- };
- const text a;
- int main()
- {
- a.print(); //屏幕输出 hello_const 假如对象a 定义为 text a,则输出 hello
- return ;
- }
- 补充:
- 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:
- int b = ;
- const int* a = &b; []
- int const *a = &b; []
- int* const a = &b; []
- const int* const a = &b; []
- 如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《effective c++》item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操 作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常 量。
c++类与初始化,const的更多相关文章
- 【转】forbids in-class initialization of non-const static member不能在类内初始化非const static成员
转自:forbids in-class initialization of non-const static member不能在类内初始化非const static成员 今天写程序,出现一个新错误,好 ...
- C++ —— 非类中使用const定义常量的初始化,以及#define和typedef的区别
总结一下在非类中使用const关键字定义常量时的初始化问题,亲测VS2015.顺便记录#define宏和typedef的区别. 1 首先对const声明的常量的初始化做简单小结: , w2 = , w ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- C++类构造函数初始化列表(转)
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: { public: int a; float b; //构 ...
- 为什么static数据成员一定要在类外初始化?(转)
1.避免重复定义和初始化 <<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法. 但,为什么static const int就可以在类 ...
- jvm(2)类的初始化(一)
[深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码. 1,下面说的初始化主要是类变量的初始化,实例变量的初始化触发条件不同(一 ...
- 【c++】类中的const成员
const成员变量 举个例子 #include <iostream> using namespace std; class A { public: A(int size) : SIZE(s ...
- ZT 初始化 const 成员和引用类型成员(C++)
初始化 const 成员和引用类型成员(C++) 初始化 const 成员和引用类型成员的问题,在 C++ 教材中讲述初始化列表的章节应该都有讲过,但是因为平时用得少,所以可能有不少人没注意到.待到用 ...
- C++ 静态成员的类内初始化
一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #includ ...
随机推荐
- Python 操作 MYSQL
本文介绍了 Python 操作 MYSQL.执行 SQL 语句.获取结果集.遍历结果集.取得某个字 段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多, 是一桌丰盛唯美的代 ...
- JavaScript深入之从原型到原型链(本文转载)
JavaScript深入之从原型到原型链(本文转载) https://github.com/mqyqingfeng/Blog.原文地址 构造函数创建对象 我们先使用构造函数创建一个对象: functi ...
- Jmeter之分布式测试
1)Jmeter 是纯java 应用,对于CPU和内存的消耗比较大,并且受到JVM的一些限制: 一般情况下,依据机器配置,单机的发压量为300-600,因此,当需要模拟数以千计的并发用户时,使用单台机 ...
- Redis配置文件redis.conf参数配置详解
########################################## 常规 ########################################## daemonize n ...
- Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法
Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTM ...
- 一步一步学Vue (一)
vue应该是前端主流框架中的集成大成者,它吸取了knockout,angular,react设置avalon的经验,支持各种模式写法,入门很简单,从本章开始,会记录学习vue中的点点滴滴,以笔记的形式 ...
- IPSP问题
场景:接触IPSP项目是个学习的过程,在此记录一些自己的认知,让自己更能全面的理解项目! 1 总结 1.1 日志追踪 IPSP工程所在的服务器有GW和Server之分,GW是连接外部服务器和serve ...
- (转)Sublime Text2 快捷键汇总
场景:最近在编写项目中越发的感觉到一个得心应手的编辑器是多么的重要,而sublime,无疑是让我用着最舒服,最有感觉的编辑器了! 1 快捷键总结 一个好的编辑器,能大大提高编程的效率.如果能熟知软件的 ...
- Java 9 揭秘(17. Reactive Streams)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: 什么是流(stream) 响应式流(Reactive Streams)的倡议是什么,以及规范和Java API 响应式流在JDK 中的AP ...
- C语言指针2(空指针,野指针)
//最近,有朋友开玩笑问 int *p *是指针还是p是指针还是*p是指针,当然了,知道的都知道p是指针 //野指针----->>>指没有指向一个地址的指针(指针指向地址请参考上一 ...